Linux的Shell编程基础(下)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_41685388/article/details/102630781

Linux的Shell编程基础(上):https://blog.csdn.net/weixin_41685388/article/details/102616437

1、Shell printf 命令

  • printf和echo都是输出命令,printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。
  • 默认 printf 不会像 echo 自动在执行语句后添加换行符,我们可以手动添加 \n(echo "Hello, xiaohuang!" 等价于 printf "Hello, xiaohuang!\n")
  • printf的格式替代符%s %c %d %f
  • %-10s  #限定宽度为10个字符的字符串,字符不够空格来补(-表示左对齐,没有则表示右对齐)

  • %-4.2f  #限定最小宽度为4个字符的浮点数,宽度不够空格来补,小时点后面保留2位,位数不够0来补,左对齐

  • %d       #十进制整数型数据

  • %c      #表示输出格式为字符

  • [root@hadoop02 shell01]# vim Demo4.sh
    #!/bin/bash
    #printf的使用
    printf "%-10s %-8s %-4s\n" 姓名 性别 身高m
    printf "%-10s %-8s %-4.2f\n" 小王 男 1.7  
    printf "%-10s %-8s %-4.2f\n" 小张 男 1.86543
    printf "%-10s %-8s %-4.2f\n" 小刘 女 1.79876                                                              
    ~                                                                
    "Demo4.sh" 6L, 222C written
    #添加可执行权                    
    [root@hadoop02 shell01]# chmod +x  Demo4.sh
    #查看可执行权
    [root@hadoop02 shell01]# ll
    total 4
    -rwxr-xr-x. 1 root root  222 Oct 18 06:34 Demo4.sh
    #执行脚本
    [root@hadoop02 shell01]# sh Demo4.sh       
    姓名     性别   身高m
    小王     男      1.70
    小张     男      1.87
    小刘     女      1.80
    [root@hadoop02 shell01]# 
    序列 说明
    \a 警告字符,通常为ASCII的BEL字符
    \b 后退
    \c 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略
    \f 换页(formfeed)
    \n 换行
    \r 回车(Carriage return)
    \t 水平制表符
    \v 垂直制表符
    \\ 一个字面上的反斜杠字符
    \ddd 表示1到3位数八进制值的字符。仅在格式字符串中有效
    \0ddd 表示1到3位的八进制值字符

2、Shell test 命令

  • Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
  • test 与[] 有同样的效果

如:[ $1 -ne $2 -a $1 -gt $2 ] 等价于 test $1 -ne $2 -a $1 -gt $2 等价于[[ $1 -ne $2 && $1 -gt $2 ]]

但是test一般不能和逻辑运算符混用

[root@hadoop02 shell01]# vim Demo5.sh 
#!/bin/bash
a=10
b=$1
echo "原有参数a=${a}"
echo "传递参数b=${b}"

if test -n "${b}" -a $1 -eq ${a}
then
        printf "字符不为空,"
        printf "字符长度为: ${#b}\n"
        printf "结果:$1 = ${a}\n"
elif test -n "${b}" -a $1 -gt ${a}
then
        printf "字符不为空,"
        printf "字符长度为: ${#b}\n"
        printf "结果:$1 > ${a}\n"
elif test -n "${b}" -a $1 -lt ${a}
then
        printf "字符不为空,"
        printf "字符长度为: ${#b}\n"
        printf "结果:$1 < ${a}\n" 
else
        printf "请在执行代码时传递数值参数!\n"
fi
~                                                                                                                                                                                         
"Demo5.sh" 24L, 578C written                   
[root@hadoop02 shell01]# sh Demo5.sh 1
原有参数a=10
传递参数b=1
字符不为空,字符长度为: 1
结果:1 < 10

3、Shell 流程控制

if条件判断语句

for 循环

while 语句

until 循环

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi
for var in item1 item2 ... itemN ;
do
    command1
    command2
    ...
    commandN
done
while condition
do
    command
done

如:
int2=10
while [ ${int2} -le 15 ]
do
        echo "${int2}"
        int2=`expr ${int2} + 1`
done

until condition
do
    command
done

#until 循环与 while 循环在处理方式上刚好相反

int2=10
until [ ! ${int2} -le 15 ]
do
        echo "${int2}"
        int2=`expr ${int2} + 1`
done

 case  多选择语句

跳出循环---break命令

跳出循环---continue命令

case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac
break命令允许跳出所有循环(终止执行后面的所有循环)。 continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。

4、Shell 函数

定义格式如下 案例1
[function] funname[()]

{

    action;

    [return int;]

}

#!/bin/bash
demofun(){
        echo "shell函数"
}
echo "开始执行函数"
demofun
echo "执行完毕!"

案例2 案例3--函数传参
#!/bin/bash
demofun(){
        echo "求余数"
        echo -n "输入被除数:"
        read a
        echo -n "输入除数:"
        read b
        c=`expr ${a} % ${b}`
        echo "余数是:${c}"
        return
}
echo "开始执行函数"
demofun
echo "执行完毕!"
#!/bin/bash
funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "输出所有参数 $* !"
    echo "脚本运行的当前进程ID号 $$ !"
    echo "后台运行最后1个进程ID号$! !"
    echo "输出所有参数 $@ !"
    echo "shell使用的当前选项 $- !"
    echo "输出最后命令的退出状态 $? !"
}
funWithParam 1 2 3 4 5 6 7 8 9 10 11

5、Shell 输入/输出重定向

命令 说明
command > file 将输出重定向到 file。
command < file 将输入重定向到 file。
command >> file 将输出以追加的方式重定向到 file。
n > file 将文件描述符为 n 的文件重定向到 file。
n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m 将输出文件 m 和 n 合并。
n <& m 将输入文件 m 和 n 合并。
<< tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。

一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:

  • 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
  • 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
  • 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。

默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。

案例: 

#运行Demo10.sh脚本,将输出内容写入Demo10.txt中
[root@hadoop02 shell01]# sh Demo10.sh 1 > Demo10.txt
#运行Demo10.sh脚本,将输出文件1和2合并内容并写入Demo1.txt中
[root@hadoop02 shell01]# sh Demo10.sh 1 > Demo1.txt 2>&1 

#其他同理

6、Shell 文件包含

  • Shell 可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。
  • 被包含的文件 **.sh 可以不需要可执行权限。

 

猜你喜欢

转载自blog.csdn.net/weixin_41685388/article/details/102630781