shell学习之脚本语法(三)

638 阅读5分钟

条件测试: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

文章规划

好了各位,以上就是这篇文章的全部内容了,能看到这里人啊,都是人才。

如果这个文章写得还不错,觉得「王采臣」我有点东西的话 求点赞👍求关注❤️求分享👥 对耿男我来说真的非常有用!!!

白嫖不好,创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!

王采臣 | 文  【原创】

如果本篇博客有任何错误,请批评指教,不胜感激 !

微信公众号: