一、Shell语言概述
Shell是一个命令行解释器,接收应用程序/用户命令,调用操作系统内核。
Shell是一个功能强大的编程语言。
二、Shell解析器
查看Linux解析器
cat /etc/shells
(/bin/sh、/bin/bash 最常见)
/bin/sh /sbin/nologin /bin/tcsh
/bin/bash /bin/dash /bin/csh
sh是bash的软连接,sh最终还是调用bash。
bin目录下执行:
ll | grep bash
查看默认解析器
echo $SHELL
三、Shell脚本入门、编写HelloWorld
touch helloworld.sh
指定解析器,通过相对路径执行脚本需要有执行权限
#!/bin/bash
echo "helloworld"
执行脚本
sh helloworld.sh
./helloworld.sh
四、Shell中的变量
在bash值中,变量类型默认都是字符串,无法直接进行数值运算,例如:D=1+1,输出D(echo $D=1+1)输出结果不是2。
变量值有空格需要使用双引号或者单引号括起来,例如:E=“I Love You ”,输出E(echo $E)
系统变量
$HOME $USER $PWD $SHELL
当前用户家目录 当前用户 当前用户绝对路径 当前解析器
自定义变量(等号两边不能有空格)
A=1
撤销变量
unset 变量名
(unset A)
静态变量
readonly 变量名=值
(readonly B=2)
静态变量不能被撤销
unset B 不能被执行
全局变量
export 变量名(将变量提升至全局变量,可供其他的shell程序使用)
定义变量C,将变量C提升至全局变量
C=3
export C
特殊变量
$n:n为数字,0代表脚本名称,1~9表示第一到第九个参数,10以上的参数需要使用{}括起来,例如:${10}
例如:编写脚本输出该脚本名称、输入参数1、输入参数2、输入参数3的值。
touch parameter.sh
vim parameter.sh
#!/bin/bash
echo "$0 $1 $2 $3"
sh parameter.sh 输出脚本名称
sh parameter.sh 1 输出脚本名称、1
sh parameter.sh 1 2 输出脚本名称、1、2
sh parameter.sh 1 2 3 输出脚本名称、1、2、3
$#:获取所有输入参数的个数,常用于循环
$*:这个变量代表命令行中的所有参数,将所有参数当做整体
$@:这个变量代表命令行中的所有参数,将所有的参数区别对待。
$?:判断上一个命令的执行返回状态,变量值为0代表上一个命令执行成功,返回非0代表上一个命令执行失败,(具体返回哪一个值可以自己指定。)
五、运算符
1、$((运算式)) 或 $[运算式]
使用运算式,需要赋值个变量
例如:使用运算式 计算 (2+3)*5 的值
A=$(((2+3)*5) B=$[(2*3)*5]
echo $A echo $B
2、expr + - \* / %
expr 运算符之间要有空格,不需要赋值给变量
例如:使用运算符 计算 (2+3)*5 的值
expr `expr 2 + 3` \* 5
六、条件判断语句
1、[ condition ] condition(条件表达式)前后要有空格;条件表达式非空即为true,[ you ] 返回true,[ ] 返回false
2、两个整数之间的比较
= 字符串比较
-eq 等于 (equal) -ne 不等于 (not equal)
-lt 小于 (less than) -le 小于等于 (less equal)
-gt 大于 (greater than) -ge 大于等于 (greater equal)
3、按照文件的执行权限判断
-r 有读的权限 (read) -w 有写的权限 (write)
-x 有执行的权限 (exceute)
4、按照文件类型进行判断
-f 文件存在、且是一个常规文件 (file)
-e 文件存在 (existence)
-d 文件存在,且是一个目录 (directory)
5、多条件判断
&& 表示前一条命令执行成功时,才执行后一条命令
|| 表示前一条命令执行失败后,才执行后一天命令
6、实例
23 是否大于等于 32 anaconda-ks.cfg 文件是否有读的权限
[ 23 -ge 32 ] [ -r anaconda-ks.cfg ]
ehco $? ehco $?
七、流程控制
if判断
if [ 条件判断语句 ];then if [ 条件判断语句 ]
程序 then
fi 程序
fi
if 后面要有空格,条件判断表达式的 前 后 都要有空格。
实例:判断输入的数字 -eq 1,echo 100;输入的数字 -eq 2,echo50;输入的参数 -ne 1或者 -ne 2,echo 25。
cat > if.sh << EOF
#!/bin/bash
if [ $1 -eq 1 ];then
echo 100
elif [ $1 -eq 2 ];then
echo 50
elif [ ] ];then
echo 25
fi
EOF
case语句
case $变量名 in
"值1")
如果变量的值 -eq 值1,执行此
;;
"值2")
如果变量的值 -eq 值2,执行此
;;)
省略其他分支
*)
如果变量的值 -ne 值1 && -ne 值2,执行此
;;
esac
实例:判断输入的数字 -eq 1,则echo 100;输入的数字 -eq 2,则echo 50;输入的参数 -ne 1 && -ne 2,echo 25。
cat > case.sh << EOF
#!/bin/bash
case $1 in
"1")
echo 100
;;
"2")
echo 50
;;
省略其他分支
*)
echo 25
;;
esac
EOF
八、循环
for循环
for((初始值;循环控制条件;变量变化)) for 变量 in 值1,值2,值3.......
do do
程序 程序
done done
实例:从1加到100
cat > for.sh << EOF
#!/bin/bash
sum=0
for((i=1;i<=100;i++))
do
sum=$[$i+$sum]
done
echo $sum
EOF
while循环
while [ 条件表达式 ]
do
程序
done
example:
touch while.sh
vim while.sh
#!/bin/bash
sum=0
i=1
while [ $i -le 100 ]
do
sum=$[$sum + $i]
i=$[$i + 1]
done
echo $sum