4、运算符
1)算术运算符
就是加减乘除and so on。
条件表达式要放在方括号之间,并且要有空格,例如:[$a==$b]是错误的,必须写成[ $a == $b ]。
a=10 b=20 val=`expr $a + $b` echo "a + b : $val" val=`expr $a - $b` echo "a - b : $val" val=`expr $a \* $b` echo "a * b : $val" val=`expr $b / $a` echo "b / a : $val" val=`expr $b % $a` echo "b % a : $val" if [ $a == $b ] then echo "a 等于 b" fi if [ $a != $b ] then echo "a 不等于 b" fi
2)关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
● -eq:相等
● -ne:不相等
● -gt:左边大于右边
● -lt:左边小于右边
● -ge:左边大于等于右边
● -le:左边小于等于右边
a=10 b=20 if [ $a -eq $b ] then echo "$a -eq $b : a 等于 b" else echo "$a -eq $b: a 不等于 b" fi if [ $a -ne $b ] then echo "$a -ne $b: a 不等于 b" else echo "$a -ne $b : a 等于 b" fi if [ $a -gt $b ] then echo "$a -gt $b: a 大于 b" else echo "$a -gt $b: a 不大于 b" fi if [ $a -lt $b ] then echo "$a -lt $b: a 小于 b" else echo "$a -lt $b: a 不小于 b" fi if [ $a -ge $b ] then echo "$a -ge $b: a 大于或等于 b" else echo "$a -ge $b: a 小于 b" fi if [ $a -le $b ] then echo "$a -le $b: a 小于或等于 b" else echo "$a -le $b: a 大于 b" fi
3)布尔运算符
● !:非
● -o:或
● -a:与
a=10 b=20 if [ $a != $b ] then echo "$a != $b : a 不等于 b" else echo "$a == $b: a 等于 b" fi if [ $a -lt 100 -a $b -gt 15 ] then echo "$a 小于 100 且 $b 大于 15 : 返回 true" else echo "$a 小于 100 且 $b 大于 15 : 返回 false" fi if [ $a -lt 100 -o $b -gt 100 ] then echo "$a 小于 100 或 $b 大于 100 : 返回 true" else echo "$a 小于 100 或 $b 大于 100 : 返回 false" fi if [ $a -lt 5 -o $b -gt 100 ] then echo "$a 小于 5 或 $b 大于 100 : 返回 true" else echo "$a 小于 5 或 $b 大于 100 : 返回 false" fi
4)逻辑运算符
a=10 b=20 if [[ $a -lt 100 && $b -gt 100 ]] then echo "返回 true" else echo "返回 false" fi if [[ $a -lt 100 || $b -gt 100 ]] then echo "返回 true" else echo "返回 false" fi
5)字符串运算符
a="abc" b="efg" #检测两个字符串是否相等,相等返回true if [ $a = $b ] then echo "$a = $b : a 等于 b" else echo "$a = $b: a 不等于 b" fi #检测两个字符串是否不相等,不相等返回true if [ $a != $b ] then echo "$a != $b : a 不等于 b" else echo "$a != $b: a 等于 b" fi #检测字符串长度是否为0,为0返回true if [ -z $a ] then echo "-z $a : 字符串长度为 0" else echo "-z $a : 字符串长度不为 0" fi #检测字符串长度是否不为0,不为0返回true if [ -n "$a" ] then echo "-n $a : 字符串长度不为 0" else echo "-n $a : 字符串长度为 0" fi #检测字符串是否不为空,不为空返回true if [ $a ] then echo "$a : 字符串不为空" else echo "$a : 字符串为空" fi
6)文件测试运算符
文件测试运算符用于检测 Unix 文件的各种属性。
file="/var/www/runoob/test.sh" if [ -r $file ] then echo "文件可读" else echo "文件不可读" fi
5、输入输出
1)read(输入)
read -p "input your name:" str echo "read name: $str"
2)echo(输出)
echo `date`
3)printf(输出)
格式说明:
printf format-string [arguments...]
参数说明:
● format-string: 为格式控制字符串
● arguments: 为参数列表
举个栗子:
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
● %-10s:指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
● %-4.2f :指格式化为小数,其中 .2 指保留2位小数
● %s :输出一个字符串
● %d :整型输出
● %c :输出一个字符
● %f :输出实数,以小数形式输出
# format-string为双引号 printf "%d %s\n" 1 "abc" # 单引号与双引号效果一样 printf '%d %s\n' 1 "abc" # 没有引号也可以输出(没换行) printf %s abcdef # 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用(没换行) printf %s abc def printf "%s\n" abc def printf "%s %s %s\n" a b c d e f g h i j # 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替 printf "%s and %d \n"
1 abc
1 abc
abcdefabcdefabc
def
a b c
d e f
g h i
j
and 0
printf的特殊用法
6、流程控制
1)if
正常格式:
if 条件1 then 命令1 命令2 ... 命令N fi
简写一行模式:
if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi
多if-elseif-else模式:
if 条件1 then 命令1 elif 条件2 then 命令2 else 命令N fi
if else 的 ["$a" -gt "$b"]判断条件中大于使用 -gt,小于使用 -lt。
if else 的 ((a>b)) 判断条件中大于和小于可以直接使用 > 和 <。
if else 语句经常与 test 命令结合使用。
特殊:test命令
test命令是一个用于在Bash shell中测试条件的内置命令,通常被用于控制流程的判断和分支。
test命令有多种形式,最基本的语法如下:
test+选项+expression
或
[选项+expression ]
这里的expression表示一个特定的测试条件,可以是文件测试、字符串比较、数字比较等不同类型的操作。
● test命令有多种选项可以用于测试条件,这里列举一些比较常见的选项:
● -n string:判断字符串是否非空。
● -z string:判断字符串是否为空。
● -f file:判断文件是否存在且是普通文件。
● -e file:判断文件是否存在。
● -d file:判断文件是否存在且是目录。
● -r file:判断文件是否存在且可读。
● -w file:判断文件是否存在且可写。
● -x file:判断文件是否存在且可执行。
● -s file:判断文件是否存在且不为空。
这些选项可以用于组合不同类型的条件表达式,并配合逻辑运算符(如&&、||)实现复杂的控制流程。例如:
filename="example.txt" if test -f "$filename" && test -r "$filename"; then echo "yes" else echo "no" fi #或者 if [ -f "$filename" ] && [ -r "$filename" ]; then echo "yes" else echo "no" fi #或者 if [ -f example.txt ] && [ -r example.txt ]; then echo "yes" else echo "no" fi #或者 #这里使用-a选项(即逻辑与)连接两个表达式,表示需要同时满足多个条件。 if [ -f example.txt -a -r example.txt ]; then echo "yes" else echo "no" fi
这个例子检查文件myfile是否存在并且可读,如果两个条件都成立,就输出"yes",否则输出"no"。
需注意的是,在test命令中接受的所有参数都必须放在方括号内,每个参数之间必须用空格隔开,并保证最后一个参数与方括号之间有一个空格或其他分隔符。
需要注意的是,在bash shell中可以使用方括号[]来代替test命令,实现同样的效果。这就是上面的例子使用[ -f file.txt ]的原因。
2)for
一般格式:
for var in item1 item2 ... itemN do 命令1 命令2 ... 命令N done
简写一行模式:
for var in item1 item2 ... itemN; do 命令1; 命令2… done;
for loop in 1 2 3 4 5 do echo "The value is: $loop" done
#!/bin/bash for str in This is a string do echo $str done
This
is
a
string
3)while
一般格式:
while 条件 do # 可以在这里添加自己的命令 done
#!/bin/bash int=1 while(( $int<=5 )) do echo $int let "int++" done
echo '按下 <CTRL-D> 退出' echo -n '输入你最喜欢的网站名: ' while read FILM do echo "是的!$FILM 是一个好网站" done
在 Linux 终端中,按下 Ctrl+d 键可以执行以下不同的功能,具体取决于当前终端的上下文:
1.输入结束标志:当您想要从终端输入流中退出时,按下 Ctrl+d 可以指示输入结束。例如,在命令行中通过管道(|)将输出重定向到某个命令或文件中时,您可以按 Ctrl+d 表示完成输入并开始处理。
2.终止一个前台进程:如果您正在运行一个前台进程并想要强制停止它,可以使用 Ctrl+d 组合键来发送 SIGINT 信号。该信号会告诉应用程序停止当前操作和任何正在进行的数据处理,并退出进程。
3.登出当前用户:在大多数 Linux 系统中,按下 Ctrl+d 可以表示退出当前登录用户。这通常与 shell 或其他 CLI 应用程序一起使用。
总之,Ctrl+d 多种多样的作用,具体取决于您当前使用的终端上下文。在使用时,请注意其所附带的含义,并小心操作。
无限循环:
while : do # 可以在这里添加自己的命令 done 或 while true do # 可以在这里添加自己的命令 done 或 for (( ; ; )) do echo "loop will run forever unless you terminate it with Ctrl+c" # 可以在这里添加自己的命令 done
4)until
until 循环执行一系列命令直至条件为 true 时停止。
until 循环执行一系列命令直至条件为 true 时停止。
until 条件 do # 可以在这里添加自己的命令 done
a=0 # 输出0-9 until [ ! $a -lt 10 ] do echo $a a=`expr $a + 1` done
5)case
值可以为变量或常数
一般格式:
case 值 in 模式1) command1 command2 ... commandN ;; 模式2) command1 command2 ... commandN ;; esac
echo '输入 1 到 4 之间的数字:' echo '你输入的数字为:' read aNum case $aNum in 1) echo '你选择了 1' ;; 2) echo '你选择了 2' ;; 3) echo '你选择了 3' ;; 4) echo '你选择了 4' ;; *) echo '你没有输入 1 到 4 之间的数字' ;; esac
site="runoob" case "$site" in "runoob") echo "菜鸟教程" ;; "google") echo "Google 搜索" ;; "taobao") echo "淘宝网" ;; esac
6)break和continue
结束循环和跳出一层循环。同Java