echo "The First Para: $1" echo "The Second Para: $2" echo "The Third Para: $3" echo "The Fourth Para: $4" echo "The Fifth Para: $5"
echo $* echo $@ echo $#
运行结果
1 2 3 4 5 6 7 8 9
[root@localhost shell-script]# sh var_demo01.sh aaa 123 ccc 456 The First Para: aaa The Second Para: 123 The Third Para: ccc The Fourth Para: 456 The Fifth Para: aaa 123 ccc 456 aaa 123 ccc 456 4
1 2 3 4 5 6 7 8
#!/bin/bash
function add { value=`expr $1 + $2` echo $value }
add 123 456
运行结果
1 2
[root@localhost shell-script]# sh var_demo02.sh 579
环境变量
Linux是一个多租户的操作系统,针对不同的用户都会有一个专有的运行环境
不同用户的专有环境就是一组默认环境变量的组合
注意:环境变量定义通常是全大写
环境变量分类
对所有用户生效的环境变量:/etc/profile
对特定用户生效的环境变量:~/.bashrc或者~/.bash_profile
临时有效的环境变量:脚本或命令行使用export
常用环境变量
环境变量
含义
PATH
命令搜索的路径
HOME
用户家目录的路径
LONGAME
用户登录名
PWD
当前所在路径
HISTFILE
历史命令的保存文件
HISTSIZE
历史命令保存的最大行数
HOSTNAME
主机名
SHELL
用户当前使用的SHELL
PS1
以及命令提示符
TMOUT
用户和系统交互过程的超时值
IFS
系统输入分隔符
OFS
系统输出分隔符
变量生效
环境变量修改完成后,默认是不生效的,需要执行命令时环境变量生效:source 环境变量的文件
1
[root@localhost ~]# source /etc/profile
管道
思考一个小需求
需求:将系统上所有软件包列出来,然后去搜索python相关的软件包
解决方法:使用命令列出系统已有的所有软件包,然后把结果重定向到文件中,然后在文件中搜索python
rpm -qa > all_soft.txt,在利用vim去搜索python
使用管道来解决
列出所有软件包,然后将结果传递给后续命令处理
rpm -qa | grep python
管道定义
将一个命令的输出作为另一个命令的输入
从某种意义上来说,是重定向的简易实现
退出状态码
所有的shell命令都使用退出状态码来告诉shell它已执行完毕
退出状态码是一个0~255的整数值
Linux提供了一个$?来捕获退出状态码的值
Linux退出状态码
状态码
含义
0
命令成功结束
1
一般性未知错误
2
不适合的shell命令
126
命令不可执行
127
没找到命令
128
无效的退出参数
128+x
与Linux信号x相关的严重错误
130
通过Ctrl+C终止的命令
255
正常范围之外的退出码
实践用法
状态码
含义
0
命令执行成功的情况
非0
不成功的情况
练习
1 2 3 4 5 6 7 8
#!/bin/bash
date if [ $? -eq 0 ];then echo "success..." else echo "failed..." fi
case $var in pattern1) commands ;; pattern2) commands ;; esac
练习
1 2 3 4 5 6 7 8 9 10 11 12 13
#!/bin/bash
case $1 in jack) echo "hello jack" ;; mike) echo "hello mike" ;; *) echo "hello everyone" ;; esac
执行结果
1 2 3 4 5 6
[root@localhost shell-script]# sh case_demo.sh jack hello jack [root@localhost shell-script]# sh case_demo.sh mike hello mike [root@localhost shell-script]# sh case_demo.sh lili hello everyone
循环与控制
for循环命令
循环遍历一系列特定值,然后在结构体中针对每个特定值做处理
语法
1 2 3 4
for var in list do commands done
for循环读取列表的值
1 2 3 4 5 6 7 8 9 10 11
#!/bin/bash
for i in Beijing Shanghai Nanjing Guangzhou Suzhou Zhengzhou do echo "Province is $i" done
for i in {01..10} do echo "Number is $i" done
执行结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
[root@localhost shell-script]# sh for_demo01.sh Province is Beijing Province is Shanghai Province is Nanjing Province is Guangzhou Province is Suzhou Province is Zhengzhou Number is 01 Number is 02 Number is 03 Number is 04 Number is 05 Number is 06 Number is 07 Number is 08 Number is 09 Number is 10
for循环读取变量的值
1 2 3 4 5 6 7 8 9 10 11 12 13 14
#!/bin/bash
# 默认输入分隔符--空格 list="Zhangsan Lisi Mike Tome" for i in $list ; do echo "Name is $i" done
# 设置输入分隔符为--冒号: IFS=":" info="Mike:25" for i in $info ; do echo "Person info $i" done
执行结果
1 2 3 4 5 6 7
[root@localhost shell-script]# sh for_demo02.sh Name is Zhangsan Name is Lisi Name is Mike Name is Tome Person info Mike Person info 25
for循环读取命令执行的结果值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#!/bin/bash
for i in $(ls /opt/) do if [ -d /opt/$i ]; then echo "$i is DIR" elif [ -f /opt/$i ]; then echo "$i is FILE" else echo "error" fi done
# 改变系统默认输入分隔符 IFS=$'\n' for i in $(cat a.txt) ; do echo $i done
执行结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14
[root@localhost shell_script]# ll /opt/ 总用量 0 drwx--x--x. 4 root root 28 2月 21 20:09 containerd [root@localhost shell_script]# cat a.txt shanghai beijing suzhou hu nan [root@localhost shell_script]# sh for_demo01.sh containerd is DIR shanghai beijing suzhou hu nan
C语言风格的for命令用法
C语言中的for循环
1 2 3 4
for(i=0;i<10;i++) do printf("The next number is %d\n", i) done
C语言风格的for循环语法
1 2 3 4
for((a=1;a<10;a++)) do commands done
练习
1 2 3 4 5 6 7 8 9 10 11 12 13
#!/bin/bash
for((i=0;i<10;i++)) do echo "Next Number is:$i" done
for((i=1;i<=100;i++)) do (( sum+=$i )) done
echo "1+2+3+...+100=$sum"
执行结果
1 2 3 4 5 6 7 8 9 10 11 12
[root@localhost shell_script]# sh for_demo02.sh Next Number is:0 Next Number is:1 Next Number is:2 Next Number is:3 Next Number is:4 Next Number is:5 Next Number is:6 Next Number is:7 Next Number is:8 Next Number is:9 1+2+3+...+100=5050
while循环命令
while循环语法
1 2 3 4
while command do commands done
练习
1 2 3 4 5 6 7
#!/bin/bash
num=10 while [ $num -lt 20 ]; do echo "Number is $num" ((num++)) done
执行结果
1 2 3 4 5 6 7 8 9 10 11
[root@localhost shell_script]# sh while_demo.sh Number is 10 Number is 11 Number is 12 Number is 13 Number is 14 Number is 15 Number is 16 Number is 17 Number is 18 Number is 19
until命令
until循环语法
1 2 3 4
until command do commands done
练习
1 2 3 4 5 6 7 8 9
#!/bin/bash
num=10
# num=0时循环才会终止循环 until [ $num -eq 0 ]; do echo "Number is $num" ((num--)) done
执行结果
1 2 3 4 5 6 7 8 9 10 11
[root@localhost shell_script]# sh until_demo.sh Number is 10 Number is 9 Number is 8 Number is 7 Number is 6 Number is 5 Number is 4 Number is 3 Number is 2 Number is 1
控制循环的break命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
#!/bin/bash
for ((i=1;i<=10;i++));do if ((i==5)); then # 跳出整个for循环 break fi echo "$i" done
for ((i=1;i<=10;i++));do for (( j = 1; j <=5; j++ )); do if ((j==3)); then # break 数字 跳出几重循环,例如2 跳出2重循环 break 2 fi echo "$i $j" done done
for ((i=10;i<30;i++));do if ((i>15 && i<25)); then continue fi echo "Number is $i" done
执行结果
1 2 3 4 5 6 7 8 9 10 11 12
[root@localhost shell_script]# sh continue_demo.sh Number is 10 Number is 11 Number is 12 Number is 13 Number is 14 Number is 15 Number is 25 Number is 26 Number is 27 Number is 28 Number is 29
处理循环的输出
1 2 3 4 5 6 7 8 9 10 11
#!/bin/bash
for ((i=1;i<100;i++));do echo"Number is $i" done > result.txt # 将结果输出到result.txt文件中
for ((i=1;i<100;i++));do echo"Number is $i" done | grep "5" # 管道处理结果