条件测试:test [ 判断
真为0 假为1
rootcast@ubuntu:~$ var=2
rootcast@ubuntu:~$ test $var -gt 1
rootcast@ubuntu:~$ echo $?
0
rootcast@ubuntu:~$ test $var -gt 3
rootcast@ubuntu:~$ echo $?
1
rootcast@ubuntu:~$ [ $var -gt 3 ] # 参数需要用空格隔开
rootcast@ubuntu:~$ echo $?
1
rootcast@ubuntu:~$
[ -d DIR ] 如果DIR存在并且是一个目录则为真
[ -f FILE ] 如果FILE存在且是一个普通文件则为真
[ -z STRING ] 如果STRING的长度为零则为真
[ -n STRING ] 如果STRING的长度非零则为真
[ STRING1 = STRING2 ] 如果两个字符串相同则为真
[ STRING1 != STRING2 ] 如果字符串不相同则为真
比算运算符:
[ ARG1 OP ARG2 ] ARG1和ARG2应该是整数或者取值为整数的变量,OP是-eq(等于)-ne(不等于)-lt(小于)-le(小于等于)-gt(大于)-ge(大于等于)之中的一个
与或非:
[ ! EXPR ] EXPR可以是上表中的任意一种测试条件,!表示逻辑反
[ EXPR1 -a EXPR2 ] EXPR1和EXPR2可以是上表中的任意一种测试条件,-a表示逻辑与
[ EXPR1 -o EXPR2 ] EXPR1和EXPR2可以是上表中的任意一种测试条件,-o表示逻辑或
if/then/elif/else/fi
如果两条命令写在同一行则需要用;号隔开,一行只写一条命令就不需要写;号了,另外,then后面有换行,但这条命令没写完,Shell会自动续行,把下一行接在then后面当作一条命令处理。
#! /bin/sh
echo "Is root morning?"
read YES_OR_NO # 读取屏幕输入保存变量
echo "输入的为:$YES_OR_NO"
if [ "$YES_OR_NO" = "yes" ];then # [] 注意两边需要空格
echo "good morning!"
elif [ "$YES_OR_NO" = "no" ];then
echo "good afternoon!"
else
echo "$YES_OR_NO 输入错误,请输入yes or no"
exroot 1 #非0表时假 exroot退出表示状态
fi
exroot 0
[root@iZj6c25p95hhdir03i3l50Z ~]# ./demosh.sh
Is root morning?
yes
输入的为:yes
good morning!
[root@iZj6c25p95hhdir03i3l50Z ~]# ./demosh.sh
Is root morning?
no
输入的为:no
good afternoon!
[root@iZj6c25p95hhdir03i3l50Z ~]# ./demosh.sh
Is root morning?
asd
输入的为:asd
asd 输入错误,请输入yes or no
case/esac类似If
避免使用source去执行,程序遇到exroot会退出当前shell,chmod a+x 后使用./执行
#! /bin/sh
echo "IS root morning"
read YES_OR_NO
case "$YES_OR_NO" in
yes|y|Y|YES|Yes) # 语法格式
echo "good morning"
echo "good morning"
echo "good morning"
echo "good morning"
echo "good morning";; #相当于break跳出的意思,执行多条语句只要在最后加上就可以
[nN]*)
echo "good afternoon";;
*) # 写在最后匹配
echo "输入错误"
exroot 1
esac # 结束
exroot 0
# 大多数通用格式:
# $1是一个特殊变量,在执行脚本时自动取值为第一个命令行参数,也就是start,所以进入start)分支执行相关的命令。
case "$1" in
start)
...
;;
stop)
...
;;
reload | force-reload)
...
;;
restart)
...
*)
log_success_msg "Usage: nfs-kernel-server {start|stop|status|reload|force-reload|restart}"
exroot 1
;;
esac
for/do/done
#! /bin/sh
# 遍历数组
for FRUroot in 数组r; do
echo "I like $FRUroot"
done
# 例子:替换文件中的文件名
# 将当前目录下的chap0、chap1、chap2等文件名改为chap0~、 chap1~、chap2~等(按惯例,末尾有~字符的文件名表示临时文件),这个命令可以这样写:
# 方式一
for FILENAME in chap?; do mv $FILENAME $FILENAME~; done
# 方式二
for FILENAME in `ls chap?`; do mv $FILENAME $FILENAME~; done
while/do/done
ehco "请输入OK"
read VAR
while [ "$VAR" != "OK" ];do
echo "请重新输入"
read VAR
done
# 控制循环次数
#! /bin/sh
COUNTER=1
while [ "$COUNTER" -lt 10 ]; do
echo "Here we go again"
COUNTER=$(($COUNTER+1))
done
break和continue
break[n]可以指定跳出几层循环,continue跳过本次循环步,没跳出整个循环。
break跳出,continue跳过。
位置参数$数字和特殊变量
$0 相当于C语言main函数的argv[0]
$1、$2... 这些称为位置参数(Posrootional Parameter),相当于C语言main函数的argv[1]、argv[2]...
$# 相当于C语言main函数的argc - 1,注意这里的#后面不表示注释
$@ 表示参数列表"$1" "$2" ...,例如可以用在for循环中的in后面。
$* 表示参数列表"$1" "$2" ...,同上
$? 上一条命令的Exroot Status
$$ 当前进程号
shift 移除 左侧的参数
shell输入输出
echo显示文本或变量
echo [option] string
-e 解析转义字符
-n 不回车换行。默认情况echo回显的内容后面跟一个回车换行。
管道|
把一个命令的输出传递给另一个命令做输入
tee
tee命令把结果输出到标准输出,另一个副本输出到相应文件。
ls -l | tee 1.txt
文件重定向
cmd > file 显示的内容重定向文件中
cmd >> file 追加
cmd > file 2>&1 标准出错也重定向到1所指向的file里
cmd >> file 2>&1
cmd < file1 > file2 输入输出都定向到文件里
cmd < &fd 把文件描述符fd作为标准输入
cmd > &fd 把文件描述符fd作为标准输出
cmd < &- 关闭标准输入
函数
Shell脚本中的函数必须先定义后调用,一般把函数定义都写在脚本的前面,把函数调用和其它命令写在脚本的最后
# 定义
fun() # 函数名称
{
echo "$1" # 参数位
echo "hello" # 编写逻辑
}
# 调用
fun 参数1 参数2
Shell脚本的调试方法
-n # 检查脚本是否出现错误
-v # 一遍执行脚本,一遍将执行过的命令打印出来
-x # 用来进行调试脚本中的某些语句
# 运行方式
/bin/sh -n demosh.sh
文章规划
-
shell学习之脚本语法(三)
好了各位,以上就是这篇文章的全部内容了,能看到这里人啊,都是人才。
如果这个文章写得还不错,觉得「王采臣」我有点东西的话 求点赞👍求关注❤️求分享👥 对耿男我来说真的非常有用!!!
白嫖不好,创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!
王采臣 | 文 【原创】
如果本篇博客有任何错误,请批评指教,不胜感激 !
微信公众号: