Shell基本语法

一、变量

1. 变量命名之间不能有空格
2. 使用变量需要使用$符号,最好使用{}来规定变量的边界,可以在字符串中直接使用变量
3. 只读变量用 readonly  修饰
4. 删除变量 unset (unset 命令不能删除只读变量)
5. 字符串推荐使用双引号(可以有变量,也可以有转义符)

字符串

拼接字符串
your_name="Lenjor"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"

获取字符串长度
echo ${#string} #输出 4

提取子字符串
string="LenjorLiang is a great programer"
echo ${string:1:5} # 输出 enjor

查找子字符串
a="The cat sat on the mat"
test="cat"
awk -v a="$a" -v b="$test" 'BEGIN{print index(a,b)}'

数组

array_name=(value0 value1 value2 value3)
valuen=${array_name[n]}
使用 @ 或 * 符号可以获取数组中的所有元素,例如:
echo "数组的元素为: ${my_array[*]}"
echo "数组的元素为: ${my_array[@]}"

# 指定下标访问
my_array[0]=A

二、参数传递

格式: $n 	n为数字,0默认是文件名称,第一个参数从1开始
$1  标识第一个参数
$$  执行进程号
$*	获取全部参数
$#	参数个数

三、运算

val=`expr 2 \* 12 - 2`
echo $val   # 22

1. 使用 expr 来计算
2. 乘法需要有反斜杠转义
3. 每个算子之间必需要有空格分隔

四、逻辑运算符

与	-a
或	-o
非	!

五、条件分支

if [condition]
	then 
		[...]
	elif [condition]
	then
		[...]
	else
  	[...]
fi;  	

六、循环控制

# for条件循环
for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done


# while条件循环
while condition
do
    command
done

# 直到condition为true停止
until condition
do
    command
done


# case使用
case 值 in
模式1)
    command
    ...
    commandN
    ;
模式2)
    command
    ...
    commandN
    ;;
esac

七、函数

函数定义如下:
[ function ] funname [()]
{
    action;
    [return int;]
}

# 一个简单的函数例子
function myfunc(){
	name=$1;
	echo "Hello $name";
}
# 函数的调用,在后面可以添加参数,在函数体里面使用 $n 接收
myfunc Lenjor;


function myfunc(){
	echo "函数返回值:$1"
	return $1;
}
val0=0;
if (myfunc $val0)
	then echo "true";
else echo "false";
fi;

val=1;
if (myfunc $val)
	then echo "true";
else echo "false";
fi;

输出结果:
函数返回值:0
true
# 函数的返回值只能是0~255的int值,如果没有返回,会返回最后一行执行的结果,注意函数返回值作为condition的时候,只有0的时候才是true,其他的值都是false

八、Shell 输入/输出重定向

重定向命令列表如下:

命令 说明
command > file 将输出重定向到 file。
command < file 将输入重定向到 file。
command » file 将输出以追加的方式重定向到 file。
n > file 将文件描述符为 n 的文件重定向到 file。
n » file 将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m 将输出文件 m 和 n 合并。
n <& m 将输入文件 m 和 n 合并。
« tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。

九、Shell 文件包含

. filename   # 注意点号(.)和文件名中间有一空格
或 source filename

在Linux里面,经常会使用 source ~/.bash_profile 来重新加载配置