一、shell的执行
1、执行命令但不输出结果到命令行
[root@localhost ~]$ command >/dev/null
2、多命令顺序执行
命令 1;命令 2 #顺序执行命令,命令间无逻辑关联
命令 1&&命令 2 #命令1正确执行才执行命令2,否则不执行
命令 1||命令 2 #命令1不正确执行才执行命令2,否则不执行
3、执行shell的命令
[root@localhost ~]$ chmod u+x test.sh
[root@localhost ~]$ ./test.sh
[root@localhost ~]$ bash test.sh
二、shell变量
1、shell变量名称定义规则:
- 命名只能使用英文字母、数字、下划线,不能以数字开头
- 等号前后不能包含空格
- 环境变量一般使用大写
- 单引号内都是普通字符
- 双引号内可以实现转义、且有些字符有特殊含义,如"$"有调用变量的值的含义
[root@localhost ~]$ a=1
[root@localhost ~]$ a="$a"2
[root@localhost ~]$ echo $a
12
#叠加变量a
[root@localhost ~]$ a=${a}3
[root@localhost ~]$ echo $a
123
#再叠加变量a
- 双引号内可以实现转义、且有些字符有特殊含义,如"$",可以用来调用命令
单引号、双引号、反引号用法
-反引号用法:反引号括起来的内容是系统命令,在Bash中会先执行它
[root@localhost ~]$ name=wulei
#定义变量name 的值是wulei
[root@localhost ~]$ echo '$name'
$name
#如果输出时使用单引号,则$name原封不动的输出
[root@localhost ~]$ echo "$name"
wulei
#如果输出时使用双引号,则会输出变量name的值 wulei
[root@localhost ~]$ echo `date`
2018年10月21日星期一18:16:33 CST
#反引号括起来的命令会正常执行
[root@localhost ~]$ echo '`date`'
`date`
#但是如果反引号命令被单引号括起来,那么这个命令不会执行,―date会被当成普通字符输出
[root@localhost ~]$ echo "`date`"
2018年10月21日星期一18:14:21 CST
#如果是双引号括起来,那么这个命令又会正常执行
[root@localhost ~]$ echo ls
ls
#如果命令不用反引号包含,命令不会执行,而是直接输出
[root@localhost ~]$ echo `ls`
anaconda-ks.cfginstall.loginstall.log.syslog sh test testfile
#只有用反引号包括命令,这个命令才会执行
[root@localhost ~]$ echo $(date)
2018年10月21日星期一18:25:09 CST
#使用$(命令)的方式也是可以的
#在shell脚本中使用Linux命令,也需要使用$()或者``包裹命令,例如
num=$(cat /etc/passwd | grep $username | wc -l)
numt=`cat /etc/passwd | grep $username | wc -l`
位置参数变量
位置参数变量 | 作用 |
---|---|
$n | n为数字,$0表示当前 Shell 脚本程序的名称,$1-9 代表第一到第九个参数 , 十以上的参数需要用大括号包含,如 9代表第一到第九个参数,十以上的参数需要用大括号包含,如9代表第一到第九个参数,十以上的参数需要用大括号包含,如{10} |
$* | 这个变量代表命令行中所有的参数,$把所有的参数看成一个整体 |
$@ | 这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待 |
$# | 这个变量代表命令行中所有参数的个数 |
$*会把接收的所有参数当成一个整体对待,而$@则会区分对待接收到的所有参数。举个例子:
[root@localhost sh]$ vi parameter2.sh
#!/bin/bash
for i in"$*"
#定义for循环,in后面有几个值,for会循环多少次,注意“$*”要用双引号括起来
#每次循环会把in后面的值赋予变量i
#Shell把$*中的所有参数看成是一个整体,所以这个for循环只会循环一次
do
echo "The parameters is: $i"
#打印变量$i的值
done
## 带参数输入:sh parameter2.sh 1 2 3 5
## 输出结果:The parameters is: 1 2 3 5
x=1
#定义变量x的值为1,用于跟踪参数的索引
for y in"$@"
#同样in后面的有几个值,for循环几次,每次都把值赋予变量y
#可是Shel1中把“$@”中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次
do
echo "The parameter$x is: $y"
#输出变量y的值
x=$((x +1))
#然变量x每次循环都加1,为了输出时看的更清楚
done
## 带参数输入:sh parameter2.sh 1 2 3 5
## 输出结果:The parameters is: 1
# The parameters is: 2
# The parameters is: 3
# The parameters is: 5
x=1
for y in"$#"
#同样in后面的有几个值,for循环几次,每次都把值赋予变量y
do
echo "The parameter$x is: $y"
#输出变量y的个数
done
## 带参数输入:sh parameter2.sh 1 2 3 5
## 输出结果:The parameters1 is: 4
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/w918589859/article/details/108752592
三、read交互式输入
用法:
read [-t 输出后等待时间 ] [-p 提示语 ] [-s (隐藏输入)] [-n 输入参数数量校验(若不符合则输入无效) ]
举例:
read -s -t 10 -p "your age is :" age
echo $age
echo -e "\n" #-e表示输出转义字符
四、运算符
算数运算符
用法:
`expr $a + $b `
`expr $a - $b `
`expr $a \* $b `
`expr $a / $b `
`expr $a % $b ` #取余
[ $a == $b ] #判断两数值是否相等,注意前后空格及花括号,返回布尔值
[ $a != $b ] #判断两数值是否不相等,注意前后空格及花括号,返回布尔值
关系运算符
对象:数字
-eq equal 相等
-ne not equal 不相等
-gt great than 大于
-lt less than 小于
-ge great than or equal 大于等于
-le less than or equal 小于等于
# 均返回布尔值
逻辑运算符
! 非运算
-o 或运算
-a 与运算
# 均返回布尔值
字符串运算符
= 相等
!= 不相等
-z 字符串长度为0,用法[ -z $a ]
-n 字符串长度不为0,用法[ -n $a ]
str 字符串不为空,用法[ $a ]
# 均返回布尔值
文件测试运算符
用于校验文件属性
-b file 是块设备文件,用法[ -b $file ]
-c file 是字符设备文件,用法[ -c $file ]
-d file 是目录,用法[ -d $file ]
-f file 是普通文件,用法[ -f $file ]
-r file 文件可读,用法[ -r $file ]
-w file 文件可写,用法[ -w $file ]
-x file 文件可执行,用法[ -x $file ]
-s file 文件大小是否为0,用法[ -s $file ]
-e file 文件是否存在,用法[ -e $file ]
# 均返回布尔值
-e举例:
[root@localhost ~]$ vi mk_dir.sh
#!/bin/bash
#创建目录,判断是否存在,存在就结束,反之创建
DIR="/tmp/dir"
if [ ! -e $DIR ]
then
mkdir -p $DIR
fi
echo "$DIR 创建成功"
五、流程控制
if条件语句
单分支语法:
if [ 条件语句 ]
then
...
fi
双分支语法:
if [ 条件语句 ]
then
...
else
...
fi
多分支语法:
if [ 条件语句 ]
then
...
elif [ 条件语句 ]
then
...
else
...
fi
case多分支语句
当只有一种条件关系且与多级时可以使用case语句
case $变量名 in
"值1")
...
;; ##每个条件分支必须以;;结尾
"值2")
...
;;
"值3")
...
;;
*) ## 如果以上都不符合,则执行这个分支
...
;;
esac #以esac结尾
for循环语句
for 变量 in 值1 值2 值3 值4 ...(可以是一个文件)
do
...
done
举例:
[root@localhost ~]$ vi sh/auto-tar. sh
#!/bin/bash
#批量解压缩脚本
cd/lamp
#进入压缩包目录
ls *.tar.gz > ls.log
#把所有.tar.gz结尾的文件的文件覆盖到ls.log 临时文件中
for i in $(cat ls.log) `
#或者这样写for i in `cat ls.log`
#读取ls.log文件的内容,文件中有多少个值,就会循环多少次,每次循环把文件名赋予变量i
do
tar -zxf $i &>/dev/null
#加压缩,并把所有输出都丢弃
done
rm -rf /lamp/ls.log
#删除临时文件ls.log
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/w918589859/article/details/108752592
for 变量 in ((初始值;循环控制条件;变量变化))
do
...
done
举例:
[root@localhost ~]$ vi sh/add. sh
#!/bin/bash
#从1加到100
s=0
for (( i=1;i<=100;i=i+1 ))
#定义循环100 次
do
s=$(( $s+$i )) #注意这里是算术运算,因此需要2组小括号,
#每次循环给变量s赋值
done
echo "The sum of 1+2+...+100 is : $s"
#输出1加到100的和
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/w918589859/article/details/108752592
while循环语句
while [ 条件判断语句 ]
do
...
done
exit、break、conti
- exit:直接退出整个程序,可以自定义返回值,如exit 10
- break:退出所在循环语句,继续直接程序后续语句
- continue:退出本次循环,不执行循环内后面的语句,进入下一次循环
六、函数
function 函数名(){
...
}
举例:
#!/bin/bash
function add(){
s=$(($a+10))
echo $s
}
read -p "请输入原始数据:" a
add $a
cut用法:
cut -d "%" -f 1 #以%作为分隔符分隔数据,并取出第一个数