查看帮助一是man bash,二是进入www.gnu.org,找到bash的帮助文档(更详细)。
bash -x script.sh 能够调试shell脚本
一、变量
1、本地变量(都是字符的形式,没有数字类型)
version=1 或者
version="hello world" 如果有空格,那么就要用引号
数组:
arr=(1,2) 或者
array[0]=1 array[1]=2
2、引用本地变量(大部分不加" ")
$version 或者"$version" 目前未发现发现有可不同,${#versoin}输出一共有多少个字符
${array[0]}为第一个元素,${array[1]}为第二个元素,${array[*]}为所有元素,${array[@]}为所有元素,${#array[*]}为数组中所有元素的个数
{ }的使用是因为里面包含的特殊字符# 或者是[ ]
3、引用环境变量
$HOME:当前用户的主目录
$PATH:shell搜索路径
$TERM:终端程序名称
$UID:当前用户的识别字,取值是由数位构成的字串
$PWD:当前工作目录的绝对路径名,该变量的取值随cd命令的变化而变化
4、引用位置变量
$0是脚本文件名
$1 $2 ······$9 分别脚本的第一个到第九个命令行参数
$#命令行参数的个数
$@ $*所有命令行参数
$? 上一个命令的退出状态,0是正常状态,非0为非正常状态
$$ 正在进行的进程ID号
二、算术运算
no1=4
no2=5
1、let result=no1+no2
2、result=$[ $no1 +3 ]
3、result=$(( $no1 + 3 ))
4、result=`expr $no1 + 4`
三、条件判断
1、数字比较:
num=3
[ $num -gt 1 -a $num1 -lt 10 ]
eq等于,ne不等于,gt大于,ge大于等于,lt小于,le小于等于,-a表示与,-o表示或,!表示非
(( $num > 1 && $num1 < 10 ))
2、字符串比较:
verson="release 1"
[[ $version == "release 1" && $version != "test" ]],$version也可以加上引号,变为"$version" 。 [[ ]]可以使用&& ||和一些通配符
[ $version == "release 1" -a $version != "test" ]
[ -z $str ]长度为0,返回真,[ -n $str ]长度非0,返回真
3、文件判断
4、变量接受命令返回的值
homedir=`cd /home/jltxgcy && pwd`
ostype=$( uname -s )
四、语句
1、判断
if condition;
then
commands
fi
if condition;
then
commands
elif condition;
then
commands
else
commands
fi
2、循环
while condition
do
commands
done
for((i=0;i<10;i++))
{
commands
}
for var in list;
do
commands
done
五、函数调用
首先执行normalExit()前的代码,然后执行drawstars $1,调用的函数可以在此句话前也可在此句话后,函数之间传递参数,在另一个函数体重用$1,$2接收。函数中调用其他函数,其他函数的位置可位于函数前或者函数后
六、异步函数
trap "normalExit" 2 3,当发生2(Ctrl +C),3号信号时就会触发normalExit。函数体放在此句话的前后都可。如果该脚本全部执行完毕,Ctrl+C会触发normalExit(里面有语句exit 0),退出后接着echo $?会返回0。如果该脚本没有全部执行完毕,Ctrl+C就不会调用normalExit,退出后接着echo $?会返回非0
七、代码
#!/bin/bash
warn_change='the number of parameter must be between 5 and 15'
arr=(1 2) #变量如果是数字一般不加双引号
if [ $# ge 2 ]; then
echo "only one parameter is needed"
exit 1 #退出出错
fi
if (( $1 < 5 || $1 > 15 )); then #条件测试数字前不加双引号
echo $warn_change
exit 1
elif (($1 >= 5 && $1 < 10)); then
echo -en "\033[3${arr[0]}m" #echo输出一般要加上双引号,否则转移字符和空格都不起作用
else
echo -en "\033[3${arr[1]}m"
fi
#先执行以上信息
normalExit()
{
local cmd="exit 0" #定义了本地变量
echo "normal exit"
eval $cmd #安全退出,$?会得到0
}
drawstars()
{
read -p "please input style * or #:" -t 10 var
printCurrentdir " " #传递了参数
trap "normalExit" 2 3 #异步信号处理
local i
i=0
while((i<$1))# $1是drawstars $1 传递过来的
do
for ((j=0;j<$[$1-$i-1];j++))
do
echo -n " "
done
for ((j=0;j<$[2*$i+1];j++))
do
echo -n "$var"
done
echo -ne '\n' #-e使\n生效,并抑制换行,最后结果还是换行
let i++
done
echo -e "\033[0m" #恢复了黑色
sleep 60 #睡眠60s 只能这样才能让Ctrl+C派上用场
}
printCurrentdir()
{
echo -n "$1" #必须加上"",否则只输出一个空格
echo `basename \`pwd\`` #详见反引号的作用
}
drawstars $1