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,就可以直接运行函数.

 

posted @ 2017-01-03 23:28  eliker  阅读(240)  评论(0编辑  收藏  举报