🗺️博客地图
📍6.Bourne Shell(bash) 中有哪些特殊的变量?
1.Shell 脚本是什么?
2.什么是默认登录 Shell ?
- 格式:
chsh <用户名> -s <新shell>
- 示例:
chsh muzi -s /bin/sh
3.在 Shell 脚本中,如何写入注释?
#!/bin/bash
#这是一个shell测试脚本
拓展:shell脚本开头#!/bin/bash的作用
在 Shell 脚本中,#!/bin/bash
意思是指定脚本使用 Bash 解释器。它出现在脚本的第一行,并告诉操作系统使用 Bash 解释器来执行该脚本。
4.可以在 Shell 脚本中使用哪些类型的变量?
- 系统定义变量:系统变量是由系统系统自己创建的。这些变量通常由大写字母组成,可以通过 set 命令查看。
- 用户定义变量:用户变量由系统用户来生成和定义,变量的值可以通过命令 "echo $<变量名>" 查看。
5.Shell脚本中 $? 标记的用途是什么?
- 如果结束状态是 0 ,说明前一个命令执行成功。例如:
[root@localhost ~]# ls /usr/bin/share
[root@localhost ~]# echo $?
0
- 如果结束状态不是0,说明命令执行失败。例如:
[root@localhost ~]# ls /usr/bin/share
ls: cannot access /usr/bin/share: No such file or directory
[root@localhost ~]# echo $?
2
6.Bourne Shell(bash) 中有哪些特殊的变量?
$?
:这个变量用来存储上一个命令的退出状态。退出状态为0表示命令成功执行,非0值表示命令执行失败。$0
:这个变量存储当前执行的脚本或程序的名字。$1
到$9
:用于获取命令行传递的参数。$#
:这个变量存储传递给脚本的参数个数。$*
:这个变量存储作为一个单字符串的所有参数,与位置有关。$@
:这个变量也存储所有参数,但是它保留了每个参数的位置,它可以被双引号引用,以便于每个参数作为独立的字符串。$$
:这个变量存储当前shell进程的PID。$!
:这个变量存储最后一个后台运行的进程的PID。$-
:当前Shell的标志(Flag)。$_
:上一个命令的最后一个参数。
7.如何取消变量或取消变量赋值?
unset <变量名>
8.Shell 脚本中 if 语法如何嵌套?
if [ 条件 ]
then
命令1
命令2
……
fi
if [ 条件 ]
then
命令1
命令2
……
else
命令1
命令2
……
fi
9.在 Shell 脚本中如何比较两个数字?
#!/bin/bash
x=10
y=20
if [ $x -gt $y ]
then
echo “x大于y”
else
echo “y大于x”
fi
10.Shell 脚本中 case 语句的语法?
case 变量 in
值1) 指令1... ;;
值2) 指令2... ;;
*) 默认指令... ;;
esac
示例:
#!/bin/bash
read -p "Please input a number: " i
case $i in
1) echo "The num you input is 1" ;;
2) echo "The num you input is 2" ;;
3) echo "The num you input is 3" ;;
*) echo "Please input [0-9] int." exit ;;
esac
11.Shell 脚本中 for 循环语法?
for 变量 in 循环列表
do
命令1
命令2
……
done
12.Shell 脚本中 while 循环语法?
- 如同 for 循环,while 循环只要条件成立就重复它的命令块。
- 不同于 for循环,while 循环会不断迭代,直到它的条件不为真。
基础语法:
while [ 条件 ]
do
命令1
命令2
……
done
13.do-while 语句的基本格式?
- 执行顺序:与while循环不同,do-while语句首先执行一次循环体内的命令,然后再检查条件是否满足。如果条件为真,则继续执行循环体内的命令;如果条件为假,则退出循环1。
- 至少执行一次:由于do-while语句首先执行命令,因此无论条件是否满足,循环体内的命令至少会被执行一次
下面是用 do-while 语句的语法:
do {
命令1
命令2
……
} while [ 条件 ]
使用场景:
do-while语句适用于那些需要在循环开始前至少执行一次操作,并且后续操作依赖于某些条件的情况。例如,初始化变量、设置初始状态等操作可以在do-while语句的循环体中完成,然后根据条件判断是否继续执行后续操作。
示例:
假设我们想要打印1到10的数字,并且每次打印后检查是否达到10,可以使用do-while语句如下:
do {
echo $i
((i++))
} while [ $i -lt 10 ]
这段代码会首先打印变量i的值,然后增加i的值,最后检查i是否小于10。如果小于10,则继续执行循环体内的命令;否则退出循环。
14.Shell 脚本中 break 命令的作用?
15.Shell 脚本中 continue 命令的作用?
16.如何使脚本可执行?
chmod +x script.sh
17.如何调试 Shell脚本?
18.如何将标准输出和错误输出同时重定向到同一位置?
在Linux系统中:
0 表示标准输入,1表示标准输出,2表示标准错误输出。
ls /usr/share/doc > out.txt 2>&1
&>
符号用于将标准输出(STDOUT)和标准错误输出(STDERR)重定向到同一个文件。
具体来说,>
符号用于将标准输出重定向到文件,而2>&1
表示将标准错误输出重定向到当前的标准输出(即>
所指定的文件)。因此,&>
结合使用可以将标准输出和标准错误输出都重定向到同一个文件中。
ls /usr/share/doc &> out.txt
19.在 Shell 脚本中,如何测试文件?
- 文件测试参数
操作符 | 描述 |
---|---|
-b file | 如果file是文件并且是特殊块文件,则返回true</div> |
-c file | 如果file是字符文件,则返回true |
-d file | 如果file存在且是目录,则返回true |
-a/-e file | 如果file存在,则返回true |
-f file | 如果file存在且是常规文件,则返回true |
-g file | 如果file的GroupId已设置,则返回true |
-h/-L file | 如果file是一个符号链接,则返回true |
-k file | 如果file文件存在且粘滞位已设置,则返回true |
-p file | 如果file是命名管道(FIFO),则返回true |
-r file | 如果file文件存在且可读,则返回true |
-s file | 如果file文件大小不为零,则返回true |
-t file | 如果file已打开并与终端关联,则返回true |
-u file | 如果file的UserId已设置,则返回true |
-w file | 如果file文件存在且可写,则返回true |
-x file | 如果file文件存在且可执行,则返回true |
file1 -ot file2 | 如果file1比file2旧,则返回true |
file1 -nt file2 | 如果file1比file2新,则返回true |
file1 -ef file2 | 如果file1是file2的符号链接或硬链接,则返回true |
- 字符串测试参数
操作符 | 描述 |
---|---|
-n string | 如果字符串长度非零,则返回true |
-z string | 如果字符长度为零,则返回true |
string1 = string2 | 如果两个字符相同,则返回true |
string1 != string2 | 如果两个字符不相同,则返回true |
string | 如果字符非空,则返回true |
- 数值比较测试参数
操作符 | 描述 |
---|---|
num1 -eq num2 | 如果连个数值相等,则返回true |
num1 -ne num2 | 如果连个数值不等,则返回true |
num1 -gt num2 | 如果num1大于num2,则返回true |
num1 -ge num2 | 如果num1大于或等于num2,则返回true |
num1 -lt num2 | 如果num1小于num2,则返回true |
num1 -le num2 | 如果num1小于或等于num2,则返回true |
- 组合运算符参数(用于单个或多个测试)
操作符 | 描述 |
---|---|
!expression | 一元否定运算符 |
expression1 -a expression2 | 二元与运算符 |
expression1 -o expression2 | 二元或运算符 |
\ (Expression\) | 必须使用反斜杠转义分组括号 |
- 退出码参数
操作符 | 描述 |
---|---|
0 | 返回true |
1 | 返回false |
>1 | 发生错误 |
20.在 Shell 脚本如何定义函数呢?
function_name() {
# 函数体
command1
command2
# ...
}
示例:
#!/bin/bash
greet() {
echo "Hello, $1!"
}
# 调用函数
greet "World"
当你运行这个脚本时,它会输出:
Hello, World!
21.如何让 Shell 就脚本得到来自终端的输入?
#编辑脚本
[root@localhost ~]# vi /tmp/test.sh
#写入以下内容
#!/bin/bash
echo ‘Please enter your name’
read name
echo “My Name is $name”
#执行脚本
[root@localhost ~]# ./test.sh
Please enter your name
[root@localhost ~]# muzi
My Name is muzi
22.如何执行算术运算?
[root@localhost ~]# expr 1 + 3
4
[root@localhost ~]# expr 10 - 3
7
[root@localhost ~]# expr 10 \* 2 #注意,乘法这里要加上转义符号
20
[root@localhost ~]# expr 10 / 2
5
var1=100
var2=200
var3=$[var1+var2+1]
echo $var3