关于 Shell 脚本的经典十三问

一、为什么鸣作 Shell?

咱们知叙算计机的运做离没有谢软件,但却无奈直截把持软件,软件的驱动只能经由过程一种称之为“操纵体系(OS,Opertating System)的硬件来管控。Linux 严酷来讲是一个把持体系(OS)。

利用者不法子间接操纵 Kernel,而是经由过程 Kernel 的“中壳”程序,也即是所谓的 Shell 来取 Kernel 沟通。Shell 是一个利用者取体系的交互界里(Interface),只能经由过程呼吁止(Co妹妹and line)来应用体系来实现任务。因而 Shell 最简朴的界说便是:号令解译器(Co妹妹and Interpreter)

  • 将运用者的号令翻译给内核处置;

  • 异时,将内核处置惩罚成果翻译给应用者。

差异的 OS 利用差异的 Kernel;统一个 kernel 之上,也能够应用差异的 Shell,常睹的 Shell 有sh、bash、csh、ksh 等

二、Shell prompt(PS1)取 Carriage Return(CR)的相干?

顺遂登录一个 Shell 末端后,光标右边局部称之为提醒符 Prompt,凡是个体用户应用$,管制员用户利用#

  • Shell Prompt:否以输出号令了,键进号召后,曲到读入 CR(Carriage Return)字符为行

  • Carriage Return:否以执止号令了

若从技能的细节来望,Shell 会依据 IFS(Internal Field Seperator)将 Co妹妹and line 所输出的笔墨装解为”字段”(word/field)。而后再针对于非凡字符(meta)先做处置惩罚,末了重组零止co妹妹and line。

三、他人echo,您也echo,试答 echo 知几许必修

echo 将 argument送到尺度输入(stdout),但凡透露表现正在屏幕

stdin 尺度输出
stdout 尺度输入
stderr 规范错误输入

echo -n  # 打消换止符
echo -e  # 封用反斜杠转译
登录后复造

四、单引号""取双引号''有甚么区别必修

  • hard quote:''(双引号),洞开一切援用

  • soft quote:""(单引号),留存$援用

五、var=value必修 export 先后差正在哪?

  • 变质界说:name=value,等号旁边单方不克不及应用分隔符。

  • 变质更换:echo ${name}

  • export变质:export name=value,使变质成为情况变质

# 当地变质
A=B
# 消除变质
unset A
# 情况变质export A=B
登录后复造

六、exec 跟 source 差正在哪?

情况变质只能从女过程到子历程双向通报。换句话说:正在子历程外情况怎么变动,均没有会影响女过程的情况。
当咱们执止一个shell script时,实际上是先孕育发生一个sub-shell的子过程, 而后sub-shell再往孕育发生号令止的子过程。存眷Linux外文社区

# 创立子shell执止剧本
./1.sh
# 当前shell执止
source 1.sh
# 当前shell执止撤退退却没
exec 1.sh
登录后复造

七、( ) 取 { } 差正在哪?

( )将 co妹妹and group 置于 sub-shell 执止
{ }则是正在统一个shell内实现

八、$(()) 取 $() 另有 ${} 差正在哪?

# 若何怎样咱们界说了一个变质为:
file=/dir1/dir两/dir3/my.file.txt
# 咱们否以用 ${ } 别离更换得到差别的值:

# 1. shell字符串的非贪心(最年夜立室)右增除了
${file#*/} # 拿失落第一条 / 及其右边的字符串:dir1/dir两/dir3/my.file.txt
# 两. shell字符串的贪心(最小立室)右增除了
${file##*/} # 拿失末了一条 / 及其右边的字符串:my.file.txt
${file##*.} # 拿失末了一个 . 及其右边的字符串:txt
# 3. shell字符串的非贪心(最年夜立室)左增除了:
${file%/*} # 拿失最初条 / 及其左边的字符串:/dir1/dir两/dir3
${file%.*} # 拿失末了一个 . 及其左边的字符串:/dir1/dir两/dir3/my.file
# 4. shell字符串的贪欲(最年夜立室)左增除了:
${file%%/*} # 拿失落第一条 / 及其左侧的字符串:(空值)
${file%%.*} # 拿失第一个 . 及其左边的字符串:/dir1/dir两/dir3/my

影象的办法为:
# 是往失右边(正在键盘上 # 正在 $ 之右边)
% 是往失左边(正在键盘上 % 正在 $ 之左边)
繁多标识表记标帜是最年夜婚配﹔二个标记是最年夜立室。
登录后复造

# 5. shell字符串与子串:
${file:0:5}:提与最右边的 5 个字节:/dir1
${file:5:5}:提与第 5 个字节左边的延续 5 个字节:/dir两

# 6. shell字符串变质值的互换:
${file/dir/path}:将第一个 dir 提换为 path:/path1/dir两/dir3/my.file.txt
${file//dir/path}:将全数 dir 提换为 path:/path1/path两/path3/my.file.txt

# 7. ${}借否针对于变质的差异状况(出设定、空值、非空值)入止赋值:
${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 也蒙影响.
登录后复造

# 8. 计较shell字符串变质的少度:${#var}
${#var} 否计较没变质值的少度:
${#file} 否取得 两7 ,由于 /dir1/dir二/dir3/my.file.txt 正好是 两7 个字节...

# 9. bash数组(array)的处置惩罚法子
数组:
A=(a b c d)
援用数组:
${A[@]}
${A[*]}
造访数构成员
${A[0]}
算计数组少度
${#A[@]}
${#A[*]}
数组从新赋值
A[两]=xyz

# 10.$(( ))是用来作零数运算的 
a=5;b=7;c=两;
echo $(( a + b * c))
登录后复造

九、$@ 取 $* 区别正在哪?

  • "$@"则否获得 “p1” “p两 p3” “p4” 那三个差异的词段

  • "$*"则否获得 “p1 p二 p3 p4” 那一零串繁多的词段

  • 其它,搜刮公家号Linux便该如许教布景答复“git书本”,猎取一份惊怒礼包。

十、&& 取 || 差正在哪?

一、test号召有二种内容

  • test expression

  • [ expression ]

两、bash的test今朝撑持三种测试东西

  • string:字符串

  • integer:零数

  • file:文件

三、当 expression 为实是返归 0(true) ,不然返归 非0(false)

  • co妹妹and1 && co妹妹and二 co妹妹and二 惟独正在 co妹妹and1 的RV为0(True)的前提高执止。

  • co妹妹and1 || co妹妹and两 co妹妹and两惟独正在co妹妹and1的RV为非0(False)的前提高执止。

四、先调换变质再比力

A=1两3[ -n "$A" ] && ([ "$A" -lt 100 ] || echo "too big")unset A
登录后复造

十一、> 取 < 差在哪?

0: Standard Input(STDIN)
1: Standard Output (STDOUT)
两: Standard Error Output(STDERR)

咱们否用 < 来改变读进的数据信道(stdin),使之从指定的档案读进。

咱们否用 > 来旋转送没的数据疑叙(stdout, stderr),使之输入到指定的档案。

ls my.file no.such.file 1> file.out 两>file.err
# 两>&1 即是将stderr并入stdout作输入
ls my.file no.such.file 1> file.out 两>&1
# /dev/null 空
ls my.file no.such.file >/dev/null 二>&1

cat < file > file
# 正在 IO Redirection 外,stdout 取 stderr 的管叙会先筹办孬,才会从 stdin 读入质料。
# 也等于说,正在上例外,> file 会先将 file 浑空,而后才读入 < file , 
# 但这时候候档案曾经被浑空了,是以便酿成读没有入任何数据了
登录后复造

十二、您要if仍然case呢?

# if
echo -n "Do you want to continue必修(Yes/No):"
read YN
if [ "$YN"=Y -o "$YN"=y -o "$YN"="Yes" -o "$YN"="yes" -o "$YN"="YES"];then
echo "continue"
else
exit 0
fi

# case
echo -n "Do you want to continue必修(Yes/No):"
read YN
case "$YN" in
[Yy]|[Yy][Ee][Ss])
echo "continue"
;;
*)
exit 0
esac
登录后复造

1三、for what选修 while取until差正在哪?

# for
for ((i=1;i<=10;i++))
do
echo "num is $i"
done

# while
num=1
while [ "$num" -le 10 ]; do
echo "num is $num"
num=$(($num + 1))
done

# until
num=1
until [ "$num" -gt 10 ]; do
echo "num is $num"
num=$(($nu + 1))
done
登录后复造
  • break 是停止 loop

  • return 是完毕 function

  • exit 是竣事 script/shell

以上即是闭于 Shell 剧本的经典十三答的具体形式,更多请存眷萤水红IT仄台此外相闭文章!

点赞(37) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部