目录
一、简介
本文主要介绍shell中常用的一些语法,同时附示例方便读者快速掌握。
二 、常见语法
2.1 赋值
直接赋值
a='test' # 单引号定义字符串
b="test" # 双引号定义字符串
c=test # 也可以不加引号,同样表示字符串
d=123 #直接赋值数值
通过 $ 或者 ${} 使用,${}中的括号指定了变量的范围
name=teststr
echo $name
echo ${name}
echo ${name}big # 输出teststrbig
2.2 打印
# 直接使用echo
echo $(KBUILD_CFLAGS)
echo "this is test---------------\r\n"
# 打印内容显示红色
echo -e "\033[1;31m this is test--------------- \033[0m"
# -e 开启转义 \c 不换行
echo -e "Hi \c"
echo "body"
# 输出 Hi body
2.3 if语句
if语句一般是结合下面比较或者判断的条件,然后执行相应的命令
语法格式:
if ... then ... elif ... then... else ...
示例1:
if [ -z "$1"];then
if [ "$a" -lt "$b" ] && [ "$a" -gt 2 ];then
echo "嵌套if语句"
fi
fi
示例2:
if ! [ "$a" -lt "$b" ]
then
echo ${a} <= ${b}
else
echo ${a} < ${b}
fi
文件类型判断
参数 | 意义 |
---|---|
-e | 测试是否存在 |
-f | 测试是否为文件 |
-d | 测试是否为目录 |
整数比较
参数 | 意义 |
---|---|
-eq | 等于 |
-ne | 不等于 |
-gt | 大于 |
-lt | 小于 |
-ge | 大于等于 |
-le | 小于等于 |
字符串比较
参数 | 意义 |
---|---|
-z STRING | 判断STRING是否为空,如果为空,则返回true |
-n STRING | 判断STRING是否非空,如果非空,则返回true(-n可以省略) |
str1 == str2 | 判断str1是否等于str2 |
str1 != str2 | 判断str1是否不等于str2 |
多重判定条件
参数 | 意义 |
---|---|
-a | 两条件是否同时成立 |
-o | 两条件是否至少一个成立 |
! | 取反。如 test ! -x file,当file不可执行时,返回true |
2.4 while语句
while condition
do
语句1
语句2
...
done
示例:
while true
do
echo "this is test"
done
2.5 for语句
语法1:
for var in val1 val2 val3
do
语句1
语句2
...
done
语法2:
for ((expression; condition; expression))
do
语句1
语句2
done
示例1:
for file in `ls`
do
echo $file
done
示例2:
for i in {a..z}
do
echo $i
done
示例3:
for ((i=1; i<=100; i++))
do
echo "this is test :$i"
done
2.6 case语句
case $n in
"值1")
程序
;;
"值2")
程序
;;
*)
程序
;;
esac
case那行要以in结尾,;;代表一个条件的结束,*代表默认default
示例:
a=2
case $a in
1)
echo ${a} = 1
;;
2)
echo ${a} = 2
;;
3)
echo ${a} = 3
;;
*)
echo ${a} = 其他
;;
esac
2.7 运算
expr支持普通的算术操作,算术表达式优先级低于字符串表达式,高于逻辑关系表达式。
+ -
加减运算。两端参数会转换为整数,如果转换失败则报错。
* / %
乘,除,取模运算。两端参数会转换为整数,如果转换失败则报错。
() 可以改变优先级,但需要用反斜杠转义
a=3
b=4
echo `expr $a + $b` # 输出7
echo `expr $a - $b` # 输出-1
echo `expr $a \* $b` # 输出12,*需要转义
echo `expr $a / $b` # 输出0,整除
echo `expr $a % $b` # 输出3
echo `expr \( $a + 1 \) \* \( $b + 1 \)` # 输出20,值为(a + 1) * (b + 1)
其他加法方式:
count=$((count + 1))
let "count = 5 + 3"
2.8 注释
2.8.1 单行注释
在行首加上#符号
# 这是一个单行注释
echo "hello world!"
2.8.2 多行注释 :<<EOF EOF
以:<<EOF为一行的开头,以EOF为一行的结尾,中间为注释内容
:<<EOF
这是一个多行注释
这是一个多行注释
这是一个多行注释
EOF
可以把EOF换成任意字符串,也可以删掉:不写
:<<ccc
这是一个多行注释
这是一个多行注释
这是一个多行注释
ccc
echo "hello world!"
<<!
这是一个多行注释
这是一个多行注释
这是一个多行注释
!
2.9 shell脚本运行参数
在执行shell脚本时,可以向脚本传递参数。$1是第一个参数,$2是第二个参数,以此类推。特殊的,$0是文件名(包含路径)
创建文件test.sh:
#! /bash/bin
echo "文件名:"$0
echo "第一个参数:"$1
echo "第二个参数:"$2
echo "第三个参数:"$3
echo "第四个参数:"$4
使用以下命令
chmod +x test.sh
./test.sh 1 2 3 4
输出结果
文件名:./test.sh
第一个参数:1
第二个参数:2
第三个参数:3
第四个参数:4
其他相关变量
参数 | 说明 |
---|---|
$# | 代表文件传入的参数个数,如上例中值为4 |
$* | 由所有参数构成的用空格隔开的字符串,如上例中值为"$1 $2 $3 $4" |
$@ | 每个参数分别用双引号括起来的字符串,如上例中值为"$1" “$2” “$3” “$4” |
$$ | 脚本当前运行的进程ID |
$? | 上一条命令的退出状态(注意不是stdout,而是exit code)。0表示正常退出,其他值表示错误 |
$(command) | 返回command这条命令的stdout(可嵌套) |
command | 返回command这条命令的stdout(不可嵌套) |
2.9 shell脚本函数及调用
基本语法:
function_name() {
# 函数体
# 你希望执行的命令
}
示例一:
定义一个函数,打印 hello world
hello_world() {
echo "Hello, World!"
}
//调用
hello_world
//输出
[root@localhost /]# Hello, World!
示例二:
# 定义函数,使用 echo 返回计算结果
sum() {
echo $(($1 + $2))
}
# 调用函数并获取结果
result=$(sum 5 10)
echo "The sum is $result"
[root@localhost /]# The sum is 15