日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Bash Shell学习笔记四

發(fā)布時(shí)間:2023/12/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Bash Shell学习笔记四 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. 幾個(gè)常用命令和基本知識(shí)。

?

set $(commond)????????? 將位置參數(shù)設(shè)置為后面的命令輸出

?

shell命令中 在-- 后面的語句將會(huì)不再解釋后面的 -

?

cal 萬年歷

?

bc 計(jì)算器

?

$HISTSIZE 歷史大小

?

$RANDOM 隨機(jī)數(shù)

?

basename? pathname??? 去除路徑前綴的最后部分

?

空變量+1=1
沒有賦值或申明的變量+1=1
字符變量--->通過替換成為數(shù)字-->數(shù)字變量? 可以接受 +1操作
數(shù)字變量--->通過替換成為字符--->字符變量 不再接受 +1操作

?

使用-e 選項(xiàng)的echo 命令來打印轉(zhuǎn)義符
如果使用$'/X'結(jié)構(gòu),那-e 選項(xiàng)就不必要了
版本2 以后Bash 允許使用$'/nnn'結(jié)構(gòu),'/nnn/是8 進(jìn)制

?

"[["是一個(gè)關(guān)鍵字,并不是一個(gè)命令
Bash 把[[ $a -lt $b ]]看作一個(gè)單獨(dú)的元素,并且返回一個(gè)退出碼.

2.bash shell 數(shù)組的用法

?

?

數(shù)組申明方式:空格分隔的,()包含的字符

var=(ab sc linfe)

數(shù)組引用方式

first=$var[1] 引用第二個(gè)元素

first=$var[0] 或者 first=$var 引用第一個(gè)元素

?

獲取整個(gè)數(shù)組

whole=$var[@]

echo $whole

?

獲取數(shù)組的最大長度

long=${#var[@]}

echo $long

?

數(shù)組第N個(gè)元素字符串的長度

?

long=${#var[2]} 數(shù)組第3個(gè)元素的長度

?

獲取一部分?jǐn)?shù)組內(nèi)容

?

part=${#var[@]:1:2}

echo $part??????????????????? 獲取從第2個(gè)元素開始 3個(gè)元素的內(nèi)容

?

part=${$var[@]::2}???? 獲取從開始到第3個(gè)元素的內(nèi)容

echo $part

?

part=${#var[@]:2}????? 獲取從第3個(gè)元素開始的內(nèi)容

echo $part

?

數(shù)組的應(yīng)用:模擬棧

push:
array=(”${array[@]}” $new_element)
pop:
array=(${array[@]:0:$((${#array[@]}-1))})
shift:
array=(${array[@]:1})
unshift
array=($new_element “${array[@]}”)
function del_array {
local i
for (( i = 0 ; i < ${#array[@]} ; i++ ))
do
if [ "$1" = "${array[$i]}" ] ;then
break
fi
done
del_array_index $i
}
function del_array_index {
array=(${array[@]:0:$1} ${array[@]:$(($1 + 1))})
}

?

3.bash中的特殊字符

?

$ 數(shù)制轉(zhuǎn)換? echo $((2#101011)) 返回101011的十進(jìn)制結(jié)果

?

:內(nèi)建命令,返回值為0,命令的結(jié)果返回為0表示true,什么也不做

${HOSTNAME?} 判斷HOSTNAME是否被set

() 命令組,在()中的命令列表,將作為一個(gè)子shell來運(yùn)行

$? 前一個(gè)命令的退出狀態(tài)

$$ 進(jìn)程的pid

$*,$@ 位置參數(shù)

${ }參數(shù)替換

$ 正則表達(dá)式中的行結(jié)束符

? 正則表達(dá)式中的單個(gè)字符

? (())結(jié)構(gòu)中,用來做3元操作符

* 正則表達(dá)式中的萬能匹配

** 數(shù)學(xué)冪運(yùn)算

{}? 大括號(hào)擴(kuò)展 cat {file1,file2,filr3} > file?? cp file{1,2}

^ 匹配輸入字符串的開始位置。


$  匹配輸入字符串的結(jié)束位置。

?

~+ 等同于 $PWD 當(dāng)前目錄

?

~-? 等同于 $OLDPWD 上一個(gè)目錄

?

args=$#;lastarg=${!args} 參數(shù)傳遞中第一個(gè)為$1,$#表示總個(gè)數(shù),最后一個(gè)為 $lastarg

?

[ -n $var]? var是否被定義,定義則為真 與 [ -z $var ]測(cè)試相反

?

?

4.bash shell 中有用的結(jié)構(gòu)


until [ -z "$1" ]
do
echo -n "$1 "
shift
done


if grep -q file
then
echo ""
fi


case "$variable" in
abc) commond ;;
xyz) commond ;;
esac

?

5.如何在文件的第一行插入文字

?

sed -i s/^/abc/n/ file

?

6.stty命令詳解

轉(zhuǎn)自:http://hi.baidu.com/rakeliujie/blog/item/629c91907ac4be88a877a408.html

簡潔方式,顯示波特率
stty
speed 38400 baud; line = 0;
eol = M-^?; eol2 = M-^?; swtch = M-^?;
ixany iutf8



顯示全部設(shè)置的命令
stty -a
speed 38400 baud; rows 24; columns 80; line = 0;
intr = ^C; quit = ^/; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?;
swtch = M-^?; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke


重要一點(diǎn)
??? 屬性前面的減號(hào)表示被禁止
??? 沒有減號(hào)說明使能


上面一堆在struct termios{} 中有對(duì)應(yīng)位,或者對(duì)應(yīng)字符,c_cc[]內(nèi)為對(duì)應(yīng)字符

在include/asm-i386/termbits.h中定義這個(gè)結(jié)構(gòu)及相應(yīng)位

struct termios {
??? tcflag_t c_iflag;??????? /* input mode flags */
??? tcflag_t c_oflag;??????? /* output mode flags */
??? tcflag_t c_cflag;??????? /* control mode flags */
??? tcflag_t c_lflag;??????? /* local mode flags */
??? cc_t c_line;??????????? /* line discipline */
??? cc_t c_cc[NCCS];??????? /* control characters */
};

輸入模式
c_iflag包含如下標(biāo)志:
/* c_iflag bits */
#define IGNBRK??? 0000001
#define BRKINT??? 0000002
#define IGNPAR??? 0000004
#define PARMRK??? 0000010
#define INPCK??? 0000020
#define ISTRIP??? 0000040
#define INLCR??? 0000100
#define IGNCR??? 0000200
#define ICRNL??? 0000400
#define IUCLC??? 0001000
#define IXON??? 0002000
#define IXANY??? 0004000
#define IXOFF??? 0010000
#define IMAXBEL??? 0020000
#define IUTF8??? 0040000


brkint???? 中斷時(shí)發(fā)出 INTR 信號(hào)。
-brkint???? 中斷時(shí)不發(fā)出 INTR 信號(hào)。
icrnl???? 輸入時(shí)將 CR 映射為 NL。
-icrnl???? 輸入時(shí)不將 CR 映射為 NL。
ignbrk???? 輸入時(shí)忽略 BREAK。
-ignbrk???? 輸入時(shí)不忽略 BREAK。
igncr???? 輸入時(shí)忽略 CR。
-igncr???? 輸入時(shí)不忽略 CR。
ignpar???? 忽略奇偶錯(cuò)誤。
-ignpar???? 不忽略奇偶錯(cuò)誤。
inlcr???? 輸入時(shí)將 NL 映射為 CR。
-inlcr???? 輸入時(shí)不將 NL 映射為 CR。
inpck???? 啟用奇偶校驗(yàn)。
-inpck???? 禁用奇偶校驗(yàn)。
istrip???? 將輸入字符剝離到 7 位。
-istrip???? 不將輸入字符剝離到 7 位。
iuclc???? 將大寫字母字符映射為小寫。
-iuclc???? 不將大寫字母字符映射為小寫。
ixany???? 允許任何字符重新啟動(dòng)輸出。
-ixany???? 只允許 START(Ctrl-Q 按鍵順序)重新啟動(dòng)輸出。
ixoff???? 當(dāng)輸入隊(duì)列接近空或滿時(shí),發(fā)送 START/STOP 字符。
-ixoff???? 不發(fā)送 START/STOP 字符。
ixon???????? 啟用 START/STOP 輸出控制。一旦啟用 START/STOP 輸出控制,
??????????? 您可以按下 Ctrl-S 按鍵順序暫停向工作站的輸出,也可按下 Ctrl-Q 按鍵順序恢復(fù)輸出。
-ixon???? 禁用 START/STOP 輸出控制。
imaxbel???? 當(dāng)輸入溢出時(shí),回送 BEL 字符并且廢棄最后的輸入字符。
-imaxbel 當(dāng)輸入溢出時(shí),廢棄所有輸入。
parmrk???? 標(biāo)記奇偶錯(cuò)誤。
-parmrk???? 不標(biāo)記奇偶錯(cuò)誤[1]。



輸出模式
c_oflag包含如下標(biāo)志:
/* c_oflag bits */
#define OPOST??? 0000001
#define OLCUC??? 0000002
#define ONLCR??? 0000004
#define OCRNL??? 0000010
#define ONOCR??? 0000020
#define ONLRET??? 0000040
#define OFILL??? 0000100
#define OFDEL??? 0000200
#define NLDLY??? 0000400
#define?? NL0??? 0000000
#define?? NL1??? 0000400
#define CRDLY??? 0003000
#define?? CR0??? 0000000
#define?? CR1??? 0001000
#define?? CR2??? 0002000
#define?? CR3??? 0003000
#define TABDLY??? 0014000
#define?? TAB0??? 0000000
#define?? TAB1??? 0004000
#define?? TAB2??? 0010000
#define?? TAB3??? 0014000
#define?? XTABS??? 0014000
#define BSDLY??? 0020000
#define?? BS0??? 0000000
#define?? BS1??? 0020000
#define VTDLY??? 0040000
#define?? VT0??? 0000000
#define?? VT1??? 0040000
#define FFDLY??? 0100000
#define?? FF0??? 0000000
#define?? FF1??? 0100000


bs0, bs1????????????????? 為退格符選擇延遲樣式(bs0 表示沒有延遲)。
cr0, cr1, cr2, cr3???? 為 CR 字符選擇延遲樣式(cr0 表示沒有延遲)。
ff0, ff1???? 為換頁選擇延遲樣式(ff0 表示沒有延遲)。
nl0, nl1???? 為 NL 字符選擇延遲樣式(nl0 表示沒有延遲)。
ofill???? 使用延遲填充字符。
-ofill???? 使用延遲定時(shí)。
ocrnl???? 將 CR 字符映射為 NL 字符。
-ocrnl???? 不將 CR 字符映射為 NL 字符。
olcuc???? 輸出時(shí)將小寫字母字符映射為大寫。
-olcuc???? 輸出時(shí)不將小寫字母字符映射為大寫。
onlcr???? 將 NL 字符映射為 CR-NL 字符。
-onlcr???? 不將 NL 字符映射為 CR-NL 字符。
onlret???? 在終端 NL 執(zhí)行 CR 功能。
-onlret???? 在終端 NL 不執(zhí)行 CR 功能。
onocr???? 不在零列輸出 CR 字符。
-onocr???? 在零列輸出 CR 字符。
opost???? 處理輸出。
-opost???? 不處理輸出;即忽略所有其它輸出選項(xiàng)。
ofdel???? 使用 DEL 字符作為填充字符。
-ofdel???? 使用 NUL 字符作為填充字符。
tab0, tab1, tab2???? 為水平制表符選擇延遲樣式(tab0 表示沒有延遲)。
tab3???????????????????? 擴(kuò)展制表符至多個(gè)空格。
vt0, vt1???????????? 為垂直制表符選擇延遲樣式(vt0 表示沒有延遲)[1]。


控制模式
/* c_cflag bit meaning */
#define CBAUD??? 0010017
#define B0??? 0000000??????? /* hang up */
#define B50??? 0000001
#define B75??? 0000002
#define B110??? 0000003
#define B134??? 0000004
#define B150??? 0000005
#define B200??? 0000006
#define B300??? 0000007
#define B600??? 0000010
#define B1200??? 0000011
#define B1800??? 0000012
#define B2400??? 0000013
#define B4800??? 0000014
#define B9600??? 0000015
#define B19200??? 0000016
#define B38400??? 0000017
#define EXTA B19200
#define EXTB B38400
#define CSIZE??? 0000060
#define?? CS5??? 0000000
#define?? CS6??? 0000020
#define?? CS7??? 0000040
#define?? CS8??? 0000060
#define CSTOPB??? 0000100
#define CREAD??? 0000200
#define PARENB??? 0000400
#define PARODD??? 0001000
#define HUPCL??? 0002000
#define CLOCAL??? 0004000
#define CBAUDEX 0010000
#define??? B57600 0010001
#define?? B115200 0010002
#define?? B230400 0010003
#define?? B460800 0010004
#define?? B500000 0010005
#define?? B576000 0010006
#define?? B921600 0010007
#define B1000000 0010010
#define B1152000 0010011
#define B1500000 0010012
#define B2000000 0010013
#define B2500000 0010014
#define B3000000 0010015
#define B3500000 0010016
#define B4000000 0010017
#define CIBAUD????? 002003600000??? /* input baud rate (not used) */
#define CMSPAR????? 010000000000??????? /* mark or space (stick) parity */
#define CRTSCTS????? 020000000000??????? /* flow control */

clocal????? 假定一行沒有調(diào)制解調(diào)器控制。
-clocal???? 假定一行帶有調(diào)制解調(diào)器控制。
cread???? 啟用接收器。
-cread???? 禁用接收器。
cstopb???? 每個(gè)字符選擇兩個(gè)停止位。
-cstopb???? 每個(gè)字符選擇一個(gè)停止位。
cs5, cs6, cs7, cs8???? 選擇字符大小。
hup, hupcl???? 最后關(guān)閉時(shí)掛起撥號(hào)連接。
-hup, -hupcl???? 最后關(guān)閉時(shí)不掛起撥號(hào)連接。
parenb???? 啟用奇偶性校驗(yàn)的生成和檢測(cè)。
-parenb???? 禁用奇偶性校驗(yàn)的生成和檢測(cè)。
parodd???? 選擇奇校驗(yàn)。
-parodd???? 選擇偶校驗(yàn)。
0???? 立即掛起電話線路。
speed???? 將工作站輸入和輸出速度設(shè)置為指定的 speed 數(shù)(以位/秒為單位)。
??????????? 并不是所有的硬件接口都支持所有的速度。
??????????? speed 的可能值有:50、75、110、134、200、300、600、1200、1800、
??????????? 2400、4800、9600、19200、19.2、38400、38.4、exta 和 extb。
注:
exta、19200 和 19.2 是同義詞;extb、38400 和 38.4 是同義詞。
ispeed speed???? 將工作站輸入速度設(shè)置為指定的 speed 數(shù)(以位/秒為單位)。
??????????????????? 并不是所有的硬件接口都支持所有的速度,而且并不是所有的硬件接口都支持該選項(xiàng)。
??????????????????? speed 的可能值與 speed 選項(xiàng)相同。
ospeed speed???? 將工作站輸出速度設(shè)置為指定的 speed 數(shù)(以位/秒為單位)。
??????????????????? 并不是所有的硬件接口都支持所有的速度,而且并不是所有的硬件接口都支持該選項(xiàng)。
??????????????????? speed 的可能值與 speed 選項(xiàng)相同[1]。


本地模式
/* c_lflag bits */
#define ISIG??? 0000001
#define ICANON??? 0000002
#define XCASE??? 0000004
#define ECHO??? 0000010
#define ECHOE??? 0000020
#define ECHOK??? 0000040
#define ECHONL??? 0000100
#define NOFLSH??? 0000200
#define TOSTOP??? 0000400
#define ECHOCTL??? 0001000
#define ECHOPRT??? 0002000
#define ECHOKE??? 0004000
#define FLUSHO??? 0010000
#define PENDIN??? 0040000
#define IEXTEN??? 0100000


echo????? 回送每個(gè)輸入的字符。
-echo???? 不回送字符。
echoctl???? 以 ^X(Ctrl-X)回送控制字符,X 是將 100 八進(jìn)制加到控制字符代碼中給出的字符。
-echoctl???? 不以 ^X(Ctrl-X)回送控制字符。
echoe???? 以“backspace space backspace”字符串回送 ERASE 字符。
注:
該模式不保持對(duì)列位置的跟蹤,因此您可能在擦除制表符和轉(zhuǎn)義序列等符號(hào)時(shí)得到意外的結(jié)果。
-echoe???? 不回送 ERASE 字符,只回送退格符。
echok???? 在 KILL 字符后回送 NL 字符。
-echok???? 在 KILL 字符后不回送 NL 字符。
echoke???? 通過擦除輸出行上的每個(gè)字符,回送 KILL 字符。
-echoke???? 只回送 KILL 字符。
echonl???? 回送 NL 字符。
-echonl???? 不回送 NL 字符。
echoprt???? 以 /(斜杠)和 / (反斜杠) 向后回送擦除的字符。
-echoprt???? 不以 /(斜杠)和 / (反斜杠) 向后回送擦除的字符。
icanon???? 啟用規(guī)范輸入(規(guī)范輸入允許使用 ERASE 和 KILL 字符進(jìn)行輸入行的編輯)。
??????????? 請(qǐng)參閱 AIX 5L Version 5.2 Communications Programming Concepts 中的
???????????? Line Discipline Module (ldterm) 中關(guān)于 canonical mode input 的討論。
-icanon???? 禁用規(guī)范輸入。
iexten???? 指定從輸入數(shù)據(jù)中識(shí)別實(shí)現(xiàn)性定義的功能。
??????????? 要識(shí)別以下控制字符,
??????????? 需要設(shè)置 iexten:eol2、dsusp、reprint、discard、werase、lnext。
??????????? 與這些模式關(guān)聯(lián)的功能也需要設(shè)置 iexten:imaxbel、echoke、echoprt、echoctl。
-iexten???? 指定從輸入數(shù)據(jù)中識(shí)別實(shí)現(xiàn)性定義的功能。
isig???????? 啟用對(duì)特殊控制字符(INTR、SUSP 和 QUIT 特殊控制字符)的字符檢查。
-isig???? 禁用對(duì)特殊控制字符(INTR、SUSP 和 QUIT 特殊控制字符)的字符檢查。
noflsh???? 不清除 INTR、SUSP 或 QUIT 控制字符之后的緩沖區(qū)。
-noflsh???? 清除 INTR、SUSP 或 QUIT 控制字符之后的緩沖區(qū)。
pending???? 下次讀操作暫掛或輸入到達(dá)時(shí),要重新輸入從原始模式轉(zhuǎn)換為規(guī)范模式后被暫掛的輸入。
??????????? 暫掛是一個(gè)內(nèi)部狀態(tài)位。
-pending???? 沒有文本暫掛。
tostop???? 為背景輸出發(fā)出 SIGTOU 信號(hào)。
-tostop???? 不為背景輸出發(fā)出 SIGTOU 信號(hào)。
xcase???? 在輸入中回送大寫字符,并在輸出顯示的大寫字符之前加上 / (反斜杠)。
-xcase???? 不在輸入時(shí)回送大寫字符[1]。



控制字符
/* c_cc characters */
#define VINTR 0
#define VQUIT 1
#define VERASE 2
#define VKILL 3
#define VEOF 4
#define VTIME 5
#define VMIN 6
#define VSWTC 7
#define VSTART 8
#define VSTOP 9
#define VSUSP 10
#define VEOL 11
#define VREPRINT 12
#define VDISCARD 13
#define VWERASE 14
#define VLNEXT 15
#define VEOL2 16
控制指定
要將一個(gè)控制字符指定到某字符串中,請(qǐng)輸入:
stty Control String
其中,Control 參數(shù)可以是 INTR、QUIT、ERASE、KILL、EOF、EOL、EOL2、START、STOP、
SUSP、DSUSP、REPRINT、DISCARD、WERASE、
LNEXT、MIN 或 TIME 參數(shù)。(使用字符 MIN 和 TIME 時(shí),請(qǐng)加上 -icanon 選項(xiàng)。)[1]




試驗(yàn)

打印出終端的行數(shù)和列數(shù)
stty size
24 80
即24行,80列

stty cols 25
把列設(shè)為25行,發(fā)現(xiàn)輸出變窄
stty -a
speed 38400 baud;
rows 24; columns 25;
line = 0;
intr = ^C; quit = ^/;
erase = ^?; kill = ^U;
eof = ^D; eol = <undef>;
eol2 = <undef>;
swtch = <undef>;
start = ^Q; stop = ^S;
susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V;
flush = ^O;
min = 1; time = 0;
-parenb -parodd cs8 hupcl
-cstopb cread -clocal
-crtscts
-ignbrk brkint ignpar
-parmrk -inpck istrip
-inlcr -igncr icrnl ixon
-ixoff -iuclc -ixany
imaxbel -iutf8
opost -olcuc -ocrnl onlcr
-onocr -onlret -ofill
-ofdel nl0 cr0 tab0 bs0
vt0 ff0
isig icanon iexten echo
echoe echok -echonl
-noflsh -xcase -tostop
-echoprt echoctl echoke

stty speed
顯示速率

stty intr c
c變?yōu)橹袛噫I,想輸入c不可能了。

stty raw
發(fā)現(xiàn)ctrl+c不管用了,輸出混亂
允許原始模式輸入(不包括輸入處理,例如 erase、kill 或 interrupt);傳回奇偶(校驗(yàn))位。

stty -raw
允許規(guī)范輸入方式。

在命令行下,禁止輸出大寫的方法
stty iuclc #開啟
stty -iuclc #恢復(fù)

在命令行下禁止輸出小寫
stty olcuc #開啟
stty -olcuc#恢復(fù)

stty sane
將參數(shù)重新設(shè)置為合理的值。

忽略回車符
stty igncr #開啟
發(fā)現(xiàn)enter不起作用了,要顯示執(zhí)行效果,需用ctrl+j

stty -igncr#恢復(fù),要顯示執(zhí)行效果,需用ctrl+j

stty erase x
退格刪除鍵變成x,想輸入x,不可能了,因?yàn)閤是退格鍵
stty erase ^?返回原來退格鍵

stty -echo
發(fā)現(xiàn)按鍵,什么也沒有出現(xiàn)
stty echo
輸入顯示

stty -icanon
關(guān)閉驅(qū)動(dòng)程序中的規(guī)范模式處理,跳過緩沖層,用戶不能刪除字符,

測(cè)試一下
gui.c
#include<stdio.h>
main()
{
??? char c;
??? FILE *fp_tty;
??? fp_tty=fopen("/dev/tty","r");
??? if(fp_tty==NULL)
??????? exit(1);
??? while((c=getc(fp_tty))!=EOF)
??? {
??????? printf("%d",c);
??? }
}

gcc gui.c -o gui

stty icanon
./gui
d
10010f
10210d
10010f
10210
可以用退格鍵,并且顯示數(shù)字還得按回車鍵, 從10( enter)就可以看出來

stty -icanon
./gui
d100f102g103h104
10

?

7.如何用sed直接替換文本而不重新生成文件

?

命令

sed -i 's/pattern/replacement-string/ file

?

?

8.如何判斷變量不是空格的方法

?

命令

?

if [[ "a" != "a"$i ]]

then

?????? echo "not space"

else

?????? echo "space"

fi

?

9. ${ } 用法

${file#*/}:拿掉第一個(gè) / 及其左邊的字串:dir1/dir2/dir3/my.file.txt
${file##*/}:拿掉最后一個(gè) / 及其左邊的字串:my.file.txt
${file#*.}:拿掉第一個(gè) .??及其左邊的字串:file.txt
${file##*.}:拿掉最后一個(gè) .??及其左邊的字串:txt
${file%/*}:拿掉最后一個(gè) / 及其右邊的字串:/dir1/dir2/dir3
${file%%/*}:拿掉第一個(gè) / 及其右邊的字串:(空值)
${file%.*}:拿掉最后一個(gè) .??及其右邊的字串:/dir1/dir2/dir3/my.file
${file%%.*}:拿掉第一個(gè) .??及其右邊的字串:/dir1/dir2/dir3/my
記憶的方法為:

  • # 是去掉左邊(在鍵盤上 # 在 $ 之左邊)
    % 是去掉右邊(在鍵盤上 % 在 $ 之右邊)
    單一符號(hào)是最小匹配﹔兩個(gè)符號(hào)是最大匹配

${file:0:5}:提取最左邊的 5 個(gè)字節(jié):/dir1
${file:5:5}:提取第 5 個(gè)字符右邊的連續(xù) 5 個(gè)字節(jié):/dir2

我們也可以對(duì)變量值里的字串作替換:
${file/dir/path}:將第一個(gè) dir 替換為 path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:將全部 dir 替換為path:/path1/path2/path3/my.file.txt

利用 ${ } 還可針對(duì)不同的變數(shù)狀態(tài)賦值(沒設(shè)定、空值、非空值):
${file-my.file.txt} :假如 $file 沒有設(shè)定,則使用 my.file.txt 作傳回值。(空值及非空值時(shí)不作處理)
${file:-my.file.txt} :假如 $file 沒有設(shè)定或?yàn)榭罩?#xff0c;則使用 my.file.txt 作傳回值。 (非空值時(shí)不作處理)
${file+my.file.txt} :假如 $file 設(shè)為空值或非空值,均使用 my.file.txt 作傳回值。(沒設(shè)定時(shí)不作處理)
${file:+my.file.txt} :若 $file 為非空值,則使用 my.file.txt 作傳回值。 (沒設(shè)定及空值時(shí)不作處理)
${file=my.file.txt} :若 $file 沒設(shè)定,則使用 my.file.txt 作傳回值,同時(shí)將$file 賦值為 my.file.txt 。 (空值及非空值時(shí)不作處理)
${file:=my.file.txt} :若 $file 沒設(shè)定或?yàn)榭罩?#xff0c;則使用 my.file.txt 作傳回值,同時(shí)將 $file 賦值為 my.file.txt 。 (非空值時(shí)不作處理)
${file?my.file.txt} :若 $file 沒設(shè)定,則將 my.file.txt 輸出至 STDERR。 (空值及非空值時(shí)不作處理)
${file:?my.file.txt} :若 $file 沒設(shè)定或?yàn)榭罩?#xff0c;則將my.file.txt 輸出至 STDERR。 (非空值時(shí)不作處理)

tips:
以上的理解在于, 你一定要分清楚 unset 與 null 及 non-null 這3種賦值狀態(tài).
一般而言, : 與 null 有關(guān), 若不帶 : 的話, null 不受影響, 若帶 : 則連null 也受影響.


還有哦,${#var} 可計(jì)算出變量值的長度:
${#file} 可得到 27 ,因?yàn)?dir1/dir2/dir3/my.file.txt 剛好是 27 個(gè)字節(jié)...

?

10. bash: case 中的 shift 語句是什么意思?

轉(zhuǎn)自:http://bbs.chinaunix.net/viewthread.php?tid=218643


這牽扯到 script 或 function 的 positional parameter 。
$0 代表 script 本身(function 的 $0 也是 script)
其後的字串以 IFS 分隔,分別從 $1, $2 ...??起...
$@ 或 $* 則是 $1 到最後一個(gè) positional parameter 。

shift 是"參數(shù)向左移動(dòng)",但不好理解...??
我將之說成:shift 就是"砍掉" $@/$* 最左邊的 parameter 。
shift n 則是砍掉 n 個(gè)...

比方說,要取得第 10 個(gè) parameter ,可以:
echo ${10}
也可以:
shift 9; echo $1

總結(jié)

以上是生活随笔為你收集整理的Bash Shell学习笔记四的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。