[deepin exploration] 请教Deepin有没有类似Win中的Bat文件
Tofloor
poster avatar
立青
deepin
2025-04-10 18:04
Author

如题,想执行的命令放到文本件中,有什么格式可以双击运行?就你Windows中的Bat文件

Reply Favorite View the author
All Replies
176******99
deepin
2025-04-10 18:28
#1

.sh文件

Reply View the author
寂静的羽夏
deepin
2025-04-10 18:30
#2

在 linux 中,文件只要有可执行权限就可以执行,但能不能执行看文件类型 mime 。类比 bat 的话, linux 是 bash 脚本。

Reply View the author
玄圭SwenGway
deepin
2025-04-10 19:08
#3

.sh文件

Reply View the author
DaleSaika
deepin
2025-04-11 09:39
#4

建立把命令写好以后保持,扩展名改为.sh,再赋予运行权限,或者双击以后选择运行就可以了

Reply View the author
立青
deepin
2025-04-11 12:03
#5
DaleSaika

建立把命令写好以后保持,扩展名改为.sh,再赋予运行权限,或者双击以后选择运行就可以了

我在文档中写了这些:

sudo grub-reboot 2
shutdown -r now

然后保存为.sh文件,双击后选择运行没反应,选择在终端执行说文件类型出错。

我是哪里做的不对吗?

Reply View the author
177******61
deepin
2025-04-11 13:07
#6

你这个问题,ai能轻松解答给你

Reply View the author
早起的虫儿有鸟吃
deepin
2025-04-11 13:30
#7

就是脚本文件

Reply View the author
玄圭SwenGway
deepin
2025-04-11 13:43
#8
立青

我在文档中写了这些:

sudo grub-reboot 2
shutdown -r now

然后保存为.sh文件,双击后选择运行没反应,选择在终端执行说文件类型出错。

我是哪里做的不对吗?

1. 缺少 Shebang 行

Shell 脚本的第一行需要指定解释器(Shebang 行),否则系统不知道如何执行该脚本。

  • 解决方法:在脚本开头添加 #!/bin/bash(假设你用的是 Bash)。

修改后的脚本内容:

bash复制

#!/bin/bash
sudo grub-reboot 2
shutdown -r now
Reply View the author
Linux大宝
deepin
2025-04-11 16:32
#9

鄙人使用 Kubuntu,属于又菜又爱玩的类型,所以,只要它一有长期支持版发布,我就喜欢把硬盘包括分区做个彻底全格,直接刷上最新版本,并且还可以尝试不同的文件系统

由于怕麻烦,就写了个大约 850 行的 Shell 脚本文件(目前还在完善中……),初步安装完系统后一键启动该脚本,鄙人就抬着手机去宠幸 3D 区的蒂法和四妹了,剩下的全由电脑自动搞定,省心省力两不误

2025-04-11_16-29.jpg

Reply View the author
立青
deepin
2025-04-11 16:43
#10
玄圭SwenGway

1. 缺少 Shebang 行

Shell 脚本的第一行需要指定解释器(Shebang 行),否则系统不知道如何执行该脚本。

  • 解决方法:在脚本开头添加 #!/bin/bash(假设你用的是 Bash)。

修改后的脚本内容:

bash复制

#!/bin/bash
sudo grub-reboot 2
shutdown -r now

按你说的修改了,可以执行了,但运行后直接重启了,好像没有执行第一行,按说应该进Win10的,但还是进了Deepin。

Reply View the author
TXOS-C.User
deepin
2025-04-11 18:25
#11
玄圭SwenGway

1. 缺少 Shebang 行

Shell 脚本的第一行需要指定解释器(Shebang 行),否则系统不知道如何执行该脚本。

  • 解决方法:在脚本开头添加 #!/bin/bash(假设你用的是 Bash)。

修改后的脚本内容:

bash复制

#!/bin/bash
sudo grub-reboot 2
shutdown -r now

终于解决不能直接运行的情况了,谢谢!可以多例举些命令式吗?

Reply View the author
玄圭SwenGway
deepin
2025-04-11 18:47
#12
TXOS-C.User

终于解决不能直接运行的情况了,谢谢!可以多例举些命令式吗?

如果你会任何一个编程语言的话就很简单

#!/bin/bash
echo "Hello World"


* `#!/bin/bash` 表示使用 Bash 解释器。
2. 赋予执行权限:
**bash**复制

chmod +x hello.sh

3. 运行脚本:
**bash**复制

./hello.sh # 输出:Hello World


### **3. 变量**

#### 定义与使用变量

**bash**复制

name="Alice"
echo "Hello $name" # 输出:Hello Alice


* 变量名不加 `$`,使用时用 `$变量名`。
* 等号两边**不能有空格**!

### **4. 输入输出**

#### 读取用户输入

**bash**复制

echo "Enter your name:"
read name
echo "Hello $name"


#### 输出格式化

**bash**复制

printf "当前用户:%s\n目录:%s\n" ​(whoami) (pwd)


### **5. 条件判断(if 语句)**

#### 基本语法

**bash**复制

if [ 条件 ]; then

命令

elif [ 其他条件 ]; then

命令

else

命令

fi


#### 示例:判断数字大小

**bash**复制

num=10
if [ $num -gt 5 ]; then
echo "$num 大于 5"
else
echo "$num 小于等于 5"
fi


#### 常用比较符号:

* 数值比较:`-eq`(等于)、`-ne`(不等于)、`-gt`(大于)、`-lt`(小于)
* 字符串比较:`=`(相等)、`!=`(不等)
* 文件判断:`-f 文件存在`、`-d 目录存在`

### **6. 循环**

#### **for 循环**

遍历列表或范围:

**bash**复制

for i in 1 2 3; do
echo "数字: $i"
done

输出:

数字: 1

数字: 2

数字: 3


#### **while 循环**

**bash**复制

count=0
while [ $count -lt 3 ]; do
echo "计数: $count"
((count++))
done


### **7. 函数**

#### 定义与调用函数

**bash**复制

定义函数

say_hello() {
echo "Hello $1"
}

调用函数并传参

say_hello "Bob" # 输出:Hello Bob


* `$1` 表示第一个参数,`$2` 为第二个,依此类推。

### **8. 脚本参数**

脚本可以通过 `$1, $2, ...` 接收命令行参数:

**bash**复制

示例:脚本 add.sh

#!/bin/bash
sum=$(( $1 + $2 ))
echo "和为:$sum"

运行:./add.sh 3 5 → 输出:和为:8


#### 其他参数变量:

* `$#`:参数个数
* `$@`:所有参数列表
* `$0`:脚本名称

### **9. 实例:自动备份文件**

**bash**复制

#!/bin/bash

备份指定目录到 /backup 文件夹

backup_dir="/backup"
source_dir=$1 # 从命令行参数获取源目录

if [ -d "$source_dir" ]; then
tar -czf "​backup_dir/backup_(date +%Y%m%d).tar.gz" "$source_dir"
echo "备份成功!"
else
echo "错误:目录不存在!"
fi


### **10. 调试脚本**

* 显示执行过程:
  **bash**复制

bash -x script.sh

* 在脚本中添加 `set -x` 启用调试模式。

### **注意事项**

1. **空格敏感**:条件判断 `[ $a -eq $b ]` 中的空格必须保留。
2. **引号使用**:变量包含空格时需用双引号,如 `"$var"`。
3. **权限问题**:确保脚本有执行权限(`chmod +x`)。
Reply View the author
ljq790615
deepin
2025-04-11 21:37
#13

任何脚本文件,只要加上可执行属性即可,常用的双击后即可终端shell运行的,一般是以“.sh”为后缀的文本完档。

Reply View the author
neko
deepin
Ecological co-builder
Q&A Team
2025-04-14 08:59
#14
立青

按你说的修改了,可以执行了,但运行后直接重启了,好像没有执行第一行,按说应该进Win10的,但还是进了Deepin。

因为sudo需要交互验证密码提权才能执行后面的命令,相当于你这行没有执行成功,你可以改成pkexec弹窗提权。

Reply View the author
DaleSaika
deepin
2025-04-14 12:10
#15
立青

我在文档中写了这些:

sudo grub-reboot 2
shutdown -r now

然后保存为.sh文件,双击后选择运行没反应,选择在终端执行说文件类型出错。

我是哪里做的不对吗?

我之前说的太笼统了,这次详细一些希望有用。

sh脚本文件需要告诉终端他是个脚本,也就是首行约定俗成#!指定解释器,Deepin下通常是#!/bin/bash

之后用sudo运行两个需要root用户权限的命令,因为安全原因这样直接写是不行的

因为就两行,可以考虑通过sudo -s命令提权,逐条执行命令,也就是

#!/bin/bash

sudo -s grub-reboot 2

sudo -s reboot

保持之后扩展名改为sh,右键点属性,权限里勾上运行权限,然后双击脚本选择在终端中运行,输入密码回车应该就行了。

如果想再省省力也可以用管道给sudo传输入信息,这样双击点终端运行就直接生效,但是密码就在脚本里明文了,如果只是自己用,也可以考虑:

#!/bin/bash
echo 这里改成你的密码 | sudo -S grub-reboot 2
echo 这里改成你的密码 | sudo -S reboot

Reply View the author
晚秋(lateautumn)
Moderator
2025-04-14 15:34
#16
玄圭SwenGway

如果你会任何一个编程语言的话就很简单

#!/bin/bash
echo "Hello World"


* `#!/bin/bash` 表示使用 Bash 解释器。
2. 赋予执行权限:
**bash**复制

chmod +x hello.sh

3. 运行脚本:
**bash**复制

./hello.sh # 输出:Hello World


### **3. 变量**

#### 定义与使用变量

**bash**复制

name="Alice"
echo "Hello $name" # 输出:Hello Alice


* 变量名不加 `$`,使用时用 `$变量名`。
* 等号两边**不能有空格**!

### **4. 输入输出**

#### 读取用户输入

**bash**复制

echo "Enter your name:"
read name
echo "Hello $name"


#### 输出格式化

**bash**复制

printf "当前用户:%s\n目录:%s\n" ​(whoami) (pwd)


### **5. 条件判断(if 语句)**

#### 基本语法

**bash**复制

if [ 条件 ]; then

命令

elif [ 其他条件 ]; then

命令

else

命令

fi


#### 示例:判断数字大小

**bash**复制

num=10
if [ $num -gt 5 ]; then
echo "$num 大于 5"
else
echo "$num 小于等于 5"
fi


#### 常用比较符号:

* 数值比较:`-eq`(等于)、`-ne`(不等于)、`-gt`(大于)、`-lt`(小于)
* 字符串比较:`=`(相等)、`!=`(不等)
* 文件判断:`-f 文件存在`、`-d 目录存在`

### **6. 循环**

#### **for 循环**

遍历列表或范围:

**bash**复制

for i in 1 2 3; do
echo "数字: $i"
done

输出:

数字: 1

数字: 2

数字: 3


#### **while 循环**

**bash**复制

count=0
while [ $count -lt 3 ]; do
echo "计数: $count"
((count++))
done


### **7. 函数**

#### 定义与调用函数

**bash**复制

定义函数

say_hello() {
echo "Hello $1"
}

调用函数并传参

say_hello "Bob" # 输出:Hello Bob


* `$1` 表示第一个参数,`$2` 为第二个,依此类推。

### **8. 脚本参数**

脚本可以通过 `$1, $2, ...` 接收命令行参数:

**bash**复制

示例:脚本 add.sh

#!/bin/bash
sum=$(( $1 + $2 ))
echo "和为:$sum"

运行:./add.sh 3 5 → 输出:和为:8


#### 其他参数变量:

* `$#`:参数个数
* `$@`:所有参数列表
* `$0`:脚本名称

### **9. 实例:自动备份文件**

**bash**复制

#!/bin/bash

备份指定目录到 /backup 文件夹

backup_dir="/backup"
source_dir=$1 # 从命令行参数获取源目录

if [ -d "$source_dir" ]; then
tar -czf "​backup_dir/backup_(date +%Y%m%d).tar.gz" "$source_dir"
echo "备份成功!"
else
echo "错误:目录不存在!"
fi


### **10. 调试脚本**

* 显示执行过程:
  **bash**复制

bash -x script.sh

* 在脚本中添加 `set -x` 启用调试模式。

### **注意事项**

1. **空格敏感**:条件判断 `[ $a -eq $b ]` 中的空格必须保留。
2. **引号使用**:变量包含空格时需用双引号,如 `"$var"`。
3. **权限问题**:确保脚本有执行权限(`chmod +x`)。

学习了,厉害like

Reply View the author