bash基础
bash 是一个为GNU计划编写的Unix shell。它的名字是一系列缩写:Bourne-Again SHell — 这是关于Bourne shell(sh)的一个双关语(Bourne again / born again)。Bourne shell是一个早期的重要shell,由史蒂夫·伯恩在1978年前后编写,并同Version 7 Unix一起发布。bash则在1987年由布莱恩·福克斯创造。(取自百度百科)
它是一种脚本语言,类似于windows 操作系统里面的批处理,在平常生活中,可以利用它来进行系统化管理,包括环境配置、系统周期性操作、特殊功能的实现等。基本的用法是,由于liunx中某个操作总是伴随着一个命令行,可以将这些命令行集中到一个文件中,合并处理,利用bash语言的特性实现要求.
1基本变量的定义和操作
不存在变量的类型,随时定义随时用,只不过可以定义其特性:常量、变量、只读性(前面加上关键词readonly)
bash语言可以定义数组
#use array
array_name=(value0 value1 value2 value3)
arrayn=${array_name[3]}
echo "$arrayn+${array_name[@]}"
变量的初始化有3种方式:直接赋值,外部输入,间接赋值
yourname="elike"
readonly yourname
直接赋值如上,外部输入可以用
read variable1
就可以在命令程序执行的时候赋值
间接赋值
variable2=$yourname#或者variable2=${yourname},大括号是用来界定变量名的范围的,当引用变量的时候尽量加上大括号,防止疏漏。
2输入输出
2.1输入
假设有test.sh文件,可以像其他的运行程序一样可以在后面带参数如
>tesh.sh elike.txt cd 5
其中每个参数是按照空格符隔开的
对应于程序中的就是“$0”为“运行文件名”这里$0=test.sh,“$1”为第一个参数:elike.txt,然后依次类推
注意:$#为参数的个数;$*为你在终端里输入的所有参数,并将其作为一个字符串储存;$@表示所有输入的参数,但是每一次调用只输出一个参数,下一次调用是自动偏移到下一个参数。
2.2输出
对于输出,内容就比较丰富。有两个输出命令需要知道,echo和printf
#echo
echo $your_name
for skill in Ada Coffe Action java; do
echo "I am good at ${skill}script"
done
注意:当输出仅为变量时可以不用引号。单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的。双引号里可以出现转义字符,如“\n”,“\c”等。
echo –n "so what"
echo –e "How are you\c"
在echo后面加上-n就不让默认的换行符输出,所以最后显示是一行。
\a 发出警告声;
\b 删除前一个字符;
\c 最后不加上换行符号;
\f 换行但光标仍旧停留在原来的位置;
\n 换行且光标移至行首;
\r 光标移至行首,但不换行;
\t 插入tab;
\v 与\f相同;
\\ 插入\字符;
\nnn 插入nnn(八进制)所代表的ASCII字符;
#printf
不是很常用,下面只是给出一个例子
printf "%-10s %-8s %-4s\n" name gender weight_kg
printf "%-10s %-8s %-4.2f\n" guojing man 66.1234
printf "%-10s %-8s %-4.2f\n" yangguo man 48.6543
printf "%-10s %-8s %-4.2f\n" furong woman 47.9876
printf "%d %s\n" 1 "abc"
printf '%d %s\n' 1 "abc"
printf %s abcdef
printf %s abs def
3分支
#if-then-[elif-then-][else-]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 "don't have a case is belong to this condition"
fi
注意:判断条件中中括号两边都要有空格,且中间的逻辑判断符与变量之间应该用空格间隔开。若写了else,else执行的不能为空。
#case-esac
echo "please input a number ranged from 1 to 4"
read aNum
case $aNum in
1) echo 'you have chosen 1'
;;
2) echo 'you have chosen 2'
;;
3) echo 'you have chosen 3'
;;
4) echo 'you have chosen 4'
;;
*) echo 'you have not input a number in the range of 1 to 4'
;;
esac
注意:关键字“in”和采用两个分号分割不同的情况。
4循环
#for
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
#while
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
注意:while后面的双层括号不可少,同时两边的空格也不可少.
在循环里可以用break语句中断循环.
5函数
funWithReturn(){
echo "this function can return the sum of two number"
echo "please input the first number:"
read aNum
echo "please input the other number:"
read anotherNum
echo -e "${aNum} + ${anotherNum} = \c"
sumNum=`expr ${aNum} + ${anotherNum}`
echo $sumNum
return ${sumNum}
}
直接运行funWithReturn,就可以直接运行函数.