1.
指定脚本类型
#!/bin/bash
修改权限,给others增加执行权限
chmod o+x xxx.sh
两条语句写在一行要加分号,无论是脚本还是命令行
2. 变量解析
shell编程中,变量分为全局变量(系统变量)、局部变量(本地变量)和特殊变量(shell专有)
参考
全局变量
即环境变量,可以在配置文件中定义和修改,也可以在命令行中设置,注意在命令行中的修改在该终端关闭时就失效了,用于临时定义某环境变量。若要永久修改环境变量,在配置文件/etc/profile
,/etc/bashrc
,/etc/profile.d
,~/.bashrc
等文件中修改。
环境变量:指定一个目录,运行软件或程序的时候,相关程序会按照目录寻找相关文件
常见系统环境变量
TMOUT:设置自动退出的误操作等待时间
HOSTTYPE:系统文件系统类型
HISTSIZE:历史命令记录条数
HOME:用户登录时进入的目录,家目录
UID:当前用户的id
SHELL:当前shell解释器
PWD:当前所在路径(每改变一次目录,该值就会改变)
PATH:可执行文件默认路径
自定义环境变量(临时的)
# export TEST1 = sugar # 1. export 变量名=value
# TEST2 = bunny; export TEST2 # 2. 变量名=value;export 变量名
# declare -x TEST3 = what # 3. declare -x 变量名=value
# env | grep TEST
TEST1=sugar
TEST2=bunny
TEST3=what
局部变量
本地变量只在创建它们的shell脚本中使用,环境变量可以在创建它们的shell脚本及其派生出来的子进程中使用。
a=12345
b=12345-$a
c='12345-$a'
d="12345-$a"
echo b c d
结果:
12345-12345
12345-$a
12345-12345
单引号与双引号的区别在于:单引号内若存在变量,存在的变量当做字符串不会被解析,原样输出;而双引号中若存在变量,该变量会被解析出其具体的值再加入到字符串中。
①不加引号可以直接定义内容包含数字、字符串、路径名等,适合定义数字
②单引号适合于纯定义字符串,
③而双引号适合于字符串的内容中包含有变量的内容的定义。
(习惯:数字以及不带空格的简单字符串不加引号,其它长的特别是有空格的字符串加双引号;遇到“
变量名”,但不想解析的加单引号,但一般出现
变
量
名
”
,
但
不
想
解
析
的
加
单
引
号
,
但
一
般
出
现
都是为了解析变量,所以单引号较少使用)
注意在awk中单引号和双引号反过来了。
cmd=$(date +%F) //由于`date +%F`的反引号不容易辨认,就不太使用`date +%F`
tar -zcf code_$(date+ %F)_kang.tar.gz /etc //没有问题
tar -zcf code_`date +%F`_kang.tar.gz /etc //没有问题
tar -zcf code_kang_$cmd.tar.gz /etc //没有问题
tar -zcf code_$cmd_kang.tar.gz /etc //会有歧义,因为系统会不清楚是应该解析$cmd还是cmd_kang
tar -zcf code_${cmd}_kang.tar.gz /etc //不会有歧义
特殊变量
$0 # 当前程序的名称
$n # 当前程序的第n个参数,n=1,2,...,9
$* # 当前程序的所有参数(不包括程序本身)
$# # 当前程序的参数个数(不包括程序本身)
$? # 命令或程序执行完后的状态,一般返回0表示执行成功,用来判断上个命令是否执行成功。0表示运行成功,2表示权限拒绝,1~125为运行失败原因是脚本命令、系统命令错误或参数传递错误,126为找到该命令但是无法执行,127为无该命令/程序,>128表示命令被系统强制结束
$@ # 获取当前程序的所有参数,与$*的区别是,前者将命令行的每个参数视为单个字符串,后者将所有参数视为一个字符串
$$ # 获取当前的shell进程号
$UID # 当前用户的id
$PWD # 当前所在目录
echo -e '\033[32mTHERE IS YOUR TXT\033[0m' # 颜色,感兴趣可以自己搜索
3. 控制语句
if
格式:
if [ expression 1 ] # [ ]中expression前后两个空格很关键
then
sentence 1 # 缩进可有可无
elif [ expression 2 ]; then # then也可以连在if后面,多个分号
sentence 2
else
sentence 3
fi # 结束if
例子:
NUM=100
if (($NUM > 4));then # 两个括号,不然会认为 >和 < 是重定向
echo "this number is greater NUM"
fi
对比字符串只能使用==、<、>、!=、-z、-n。对比字符串时,末尾一定要加上x(或者a、b等)一个字符,因为if [ 1x=="ab"x]时如果没有了x,并且 1 x ==" a b " x ] 时 如 果 没 有 了 x , 并 且 1是”“,这个语句会翻译成if [ == “ab” ],左边相当于没有东西了,会报语法错误。或者使用[[ ]],就不需要x了。使用<或者>时,如果是用[ ],需要用转义符”\”,如>。
对比数字使用既能使用-eq、-ne、-gt、-ge、-lt、-le,也能使用==、<、>、!=。其中-eq的意思是equal,-ne是unequal,-gt是greater than,-ge是greater than or equal to,-lt是less than,-le是less than or equal to。
if [[ 100 -gt 85 ]]
判断目录是否存在if [ -d /data/xy ]
or if [ ! -d /data/xy ]
文件是否存在
FILES=/data/xy/information.txt
if [ -f $FILES ];then
echo "ok" >> $FILES
常用参数:
文件/目录判断:
字符串判断
数值判断
逻辑判断
IF高级特性:
常用例子:
for
for 变量 in 名字表
do
命令
done
for PID in $killid
do
/bin/kill -9 $PID 2> /dev/null
done
for DAY in Sunday Monday Tuesday Wednesday Thursday Friday Saturday
do
echo "today is : $DAY"
done
j=0
for ((i=1;i<=100;i++))
do
j=`expr %i + %j`
done
for file in $(ls *.sh)
do
echo $file is file path \! ;
done
while
while [ expression ]
do
command
done
while read line
do
echo $line
done </etc/hosts
until循环
相当于c语言的do while
until [ expression ]; do
command
done
case选择语句、select选择语句
case $arg in
case1)
command 1
;;
case2)
command 2
;;
* )
command 3
;;
esac
select i in 1 2 3
do
echo $i
done
4. 数组
nums = (1 2 3 4)
echo ${nums[0]}
5. 函数
hello() ## 函数定义
{
echo "Hello there today's date is `date +%Y-%m-%d`"
# return 2 ###返回值其实是状态码,只能在[0-255]范围内
}
hello #函数调用
echo $? #获取函数的return值,就是获取上一个命令的状态码,如果return 2没有注释,就是获取return 2 命令的状态吗。
echo "now going to the function hello intsmaze"