什么是shell?
我们知道计算机的运作不能离开硬件,但使用者却无法直接操作硬件,硬件的驱动只能通过一种称为操作系统(OS,Opertating System)的软件来管控。linux严格来说只是一个操作系统(OS),我们称之为内核(kernel)。
使用者没有办法直接操作一个kernel,而是通过kernel的外壳程序,也就是所谓的shell,来与kernel沟通。shell是一个使用者与系统的交互界面(interface), 只能让使用者通过命令行(command line)来使用系统来完成工作
shell最简单的定义就是——命令解译器(Command Interpreter):
- 不同的OS使用不同的kernel;
- 同一个kernel之上,也可以使用不同的shell
- 常见的shell有sh; bash; csh; ksh;等
echo
- -e: 启用反斜杠控制字符的转换(参考下表)
- -n: 取消行末的换行符号
echo -n "取消换行符\n123"
echo -e "123\n456\t789"
“”(双引号)与’’(单引号)的区别?
-
‘’(单引号),关闭所有引用 -
“”(双引号),保留$引用
( ) 与 { } 的区别?
- ( ) 将command group置于sub-shell执行
- { } 则是在同一个shell内完成
$(()) 与 $() 还有 ${} 的区别?
- $()与 ``(反引号) 都是用来做命令替换用的。
- ${var}与 $var 都是用来做变量替换用的。
file=/dir1/dir2/dir3/my.file.txt
${file#*/}
${file#*.}
${file##*/}
${file##*.}
${file%/*}
${file%.*}
${file%%/*}
${file%%.*}
记忆的方法为:
% 是去掉右边(在键盘上 % 在 $ 之右边)
单一符号是最小匹配﹔两个符号是最大匹配。
${file:0:5}:提取最左边的 5 个字节:/dir1
${file:5:5}:提取第 5 个字节右边的连续 5 个字节:/dir2
${file/dir/path}:将第一个 dir 提换为 path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部 dir 提换为 path:/path1/path2/path3/my.file.txt
${file-my.file.txt} :假如 $file 没有设定,则使用 my.file.txt 作传回值。(空值及非空值时不作处理)
${file:-my.file.txt} :假如 $file 没有设定或为空值,则使用 my.file.txt 作传回值。 (非空值时不作处理)
${file+my.file.txt} :假如 $file 设为空值或非空值,均使用 my.file.txt 作传回值。(没设定时不作处理)
${file:+my.file.txt} :若 $file 为非空值,则使用 my.file.txt 作传回值。 (没设定及空值时不作处理)
${file=my.file.txt} :若 $file 没设定,则使用 my.file.txt 作传回值,同时将 $file 赋值为 my.file.txt 。 (空值及非空值时不作处理)
${file:=my.file.txt} :若 $file 没设定或为空值,则使用 my.file.txt 作传回值,同时将 $file 赋值为 my.file.txt 。 (非空值时不作处理)
${file?my.file.txt} :若 $file 没设定,则将 my.file.txt 输出至 STDERR。 (空值及非空值时不作处理)
${file:?my.file.txt} :若 $file 没设定或为空值,则将 my.file.txt 输出至 STDERR。 (非空值时不作处理)
tips:
以上的理解在于, 你一定要分清楚 unset 与 null 及 non-null 这三种赋值状态.
一般而言, : 与 null 有关, 若不带 : 的话, null 不受影响, 若带 : 则连 null 也受影响.
${#var} 可计算出变量值的长度:
${#file} 可得到 27 ,因为 /dir1/dir2/dir3/my.file.txt 刚好是 27 个字节...
数组:
A=(a b c d)
引用数组:
${A[@]}
${A[*]}
访问数组成员
${A[0]}
计算数组长度
${#A[@]}
${#A[*]}
数组重新赋值
A[2]=xyz
a=5;b=7;c=2;
echo $(( a + b * c))
$@ 与 $* 的区别?
- “$@” 则可得到 “p1” “p2 p3” “p4” 这三个不同的词段
- “$*” 则可得到 “p1 p2 p3 p4” 这一整串单一的词段
bash shell中常用的loop有如下三种
for var in one two three four five
do
echo '$var is '$var
echo
done
for ((i = 1; i <= 10; i++))
do
echo "num is $i"
done
for var; do
echo "looping..."
done
num=1
while [ "$num" -le 10 ]; do
echo "num is $num"
num=$(($num + 1))
done
while:; do
echo "looping..."
done
num=1
until [ ! "$num" -le 10 ]; do
echo "num is $num"
num=$(($num + 1))
done
参考文章 questions_of_shell
|