Shell编程
2018-08-25 本文已影响9人
盗梦者_56f2
shell环境
一般常用的有两种,分别为:/bin/sh 和 /bin/bash
我们一般会在shell脚本的首行添加:#!/bin/sh 或者 #!/bin/bash
#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
运行shell脚本的方式一般有两种:./test.sh (执行命令 chmod +x ./test.sh 使test.sh具有可执行权限) 和 sh test.sh 或者 bash test.sh
shell变量
#定义变量
val="Hello World"
#使用变量
echo ${your_name}
#定义只读变量
myVar="http://www.google.com"
readonly myVar
myVar="Hello world" #会报错,因为该变量是只读的。
#删除变量
unset myVar
#获取字符串长度
string="abcd"
echo ${#string} #输出 4
#截取字符串
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo
echo ${var:7} #从左边第几个字符开始,一直到结束。
echo ${var:0-7:3} #从右边第几个字符开始,及字符的个数
echo ${var:0-7} #从右边第几个字符开始,一直到结束。
echo ${var#*/} #其中 var 是变量名,# 号是运算符,*/表示从左边开始删除第一个 / 号及左边的所有字符
echo ${var##*/} # ##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符
echo ${var%/*} # %/* 表示从右边开始,删除第一个 / 号及右边的字符
echo ${var%%/*} # %%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符
shell数组
#定义数组
array_name=(value0 value1 value2 value3)
#读取数组元素
valuen=${array_name[n]} # n为下标
#获取数组中的所有元素
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
shell注释
以"#"开头的行就是注释,会被解释器忽略。
# 这是一个注释
#多行注释
:<<EOF
注释内容...
注释内容...
注释内容...
EOF
read命令
read -p "input a val:" a #获取键盘输入的 a 变量数字 -p 参数由于设置提示信息
echo $a
expr命令
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
expr 1 + 2 #输出3
expr 5 \* 6 #输出30
shell传递参数
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:0 为执行的文件名。$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
shell文件包含
. filename # 注意点号(.)和文件名中间有一空格
或
source filename
test命令
Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
#数值测试
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi
#字符串测试
num1="ru1noob"
num2="runoob"
if test $num1 = $num2
then
echo '两个字符串相等!'
else
echo '两个字符串不相等!'
fi
#文件测试
if test -e ./bash
then
echo '文件已存在!'
else
echo '文件不存在!'
fi
-e 文件名 如果文件存在则为真
-s 文件名 如果文件存在且至少有一个字符则为真
-d 文件名 如果文件存在且为目录则为真
-f 文件名 如果文件存在且为普通文件则为真
echo命令
echo "It is a test"
echo "$name It is a test"
echo -e "OK! \c" # -e 开启转义 \c 不换行
echo `date`
printf命令
#默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n。
printf "Hello, Shell\n"
printf "%d %s\n" 1 "abc"
printf %s abc def #输出abcdef
shell流程控制
#判断语句
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
a=10
b=20
if [ $a == $b ]
then
echo "a 等于 b"
elif [ $a -gt $b ]
then
echo "a 大于 b"
elif [ $a -lt $b ]
then
echo "a 小于 b"
else
echo "没有符合的条件"
fi
#for循环
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
for((i=1;i<=5;i++));do
echo "这是第 $i 次调用";
done;
#while循环
while condition
do
command
done
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
while true
do
command
done
#until循环
#until 循环执行一系列命令直至条件为 true 时停止。
#until 循环与 while 循环在处理方式上刚好相反。
until condition
do
command
done
a=0
until [ ! $a -lt 10 ]
do
echo $a
a=`expr $a + 1`
done
#case语句
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac
在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用两个命令来实现该功能:break和continue。
shell函数
[ function ] funname [()]
{
action;
[return int;]
}
demoFun(){
echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"
shell从定向
command > file 将输出重定向到 file。
command < file 将输入重定向到 file。
command >> file 将输出以追加的方式重定向到 file。
标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。
command > file 2>&1 #将 stdout 和 stderr 合并后重定向到 file
command > /dev/null #如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null
#/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。
command > /dev/null 2>&1 #如果希望屏蔽 stdout 和 stderr
let命令
let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式
let a=5+4
let b=9-3
echo $a $b