字串按位置切片
$
[root@localhost scripts]# var=23dfja
[root@localhost scripts]# echo $
23d[root@localhost scripts]# echo $
dfja
字串模式
模式:字串按模式切片(只能從行首或行尾開始切,不能切中間部分)
[root@fa ~]# user=root:x:0:0:root:/root:/bin/bash
[root@fa ~]# echo $ #匹配到行首root,所以刪除了行首的root
:x:0:0:root:/root:/bin/bash
[root@fa ~]# echo $ #雖然存在bin,但是bin在中間,無法只切中間的部分,所以啥也沒刪除。
root:x:0:0:root:/root:/bin/bash
[root@fa ~]# echo $#雖然是貪婪匹配,能匹配到第二個root,但第二個root在中間,所以還是匹配的第乙個root
:x:0:0:root:/root:/bin/bash#匹配到行首root,所以刪除了行首的root
[root@fa ~]# echo $
:x:0:0:root:/root:/bin/bash
[root@fa ~]# echo $#貪婪模式,匹配到root:x:0:0:root:/root,所以把這部分刪除了。
:/bin/bash
[root@fa ~]# user=root:x:0:0:root:/root:/bin/bash
[root@fa ~]# echo $#雖然存在root,但是在中間和行首,不在行尾,無法只切中間的部分,所以啥也沒刪除。
root:x:0:0:root:/root:/bin/bash
[root@fa ~]# echo $ #貪婪模式,匹配到了bin/bash,所以刪除了
root:x:0:0:root:/root:/
[root@fa ~]# echo $ #匹配到了bash,所以刪除了
root:x:0:0:root:/root:/bin/
字串替換
pattern是glob風格的
[root@fa ~]# echo $user
root:x:0:0:root:/root:/bin/bash
[root@fa ~]# echo $
root:x:0:0:root:/root:/abc/bash
[root@fa ~]# echo $
abc:x:0:0:root:/root:/bin/bash
[root@fa ~]# echo $
abc:x:0:0:abc:/abc:/bin/bash
[root@fa ~]# echo $
root:x:0:0:root:/root:/abc/bash
[root@fa ~]# echo $user
root:x:0:0:root:/root:/bin/bash
[root@fa ~]# echo $
abc:x:0:0:root:/root:/bin/bash
[root@fa ~]# echo $
root:x:0:0:root:/root:/bin/bash
[root@fa ~]# echo $
root:x:0:0:root:/root:/bin/bash
[root@fa ~]# echo $
root:x:0:0:root:/root:/bin/abc
[root@fa ~]# echo $
root:x:0:0:root:/root:/abc
字串刪除
pattern是glob風格的
[root@fa ~]# echo $user
root:x:0:0:root:/root:/bin/bash
[root@fa ~]# echo $
:/bin/bash
[root@fa ~]# echo $
:/bin/bash
[root@fa ~]# echo $
:x:0:0::/:/bin/bash
[root@fa ~]# echo $
:x:0:0:root:/root:/bin/bash
[root@fa ~]# echo $user
root:x:0:0:root:/root:/bin/bash
[root@fa ~]# echo $
:x:0:0:root:/root:/bin/bash
[root@fa ~]# echo $
:/bin/bash
[root@fa ~]# echo $
root:x:0:0:root:/root:/bin/bash
[root@fa ~]# echo $
root:x:0:0:root:/root:/bin/bash
[root@fa ~]# echo $
root:x:0:0:root:/root:/bin/
字元大小寫轉換[root@fa ~]# echo $
root:x:0:0:root:/root:/bin/bash
[root@fa ~]# pa=12sssss
[root@fa ~]# echo $
12sssss
變數賦值寫乙個指令碼,實現如下功能:
提示使用者輸入乙個可執行的命令的名稱,如ls。
獲取該命令所依賴的庫檔案列表(借助ldd命令)。
複製命令至某目標目錄(例如:/mnt/sysroot/,即將此目錄當做新的根目錄)下的對應路徑中。
bash, /bin/bash --> /mnt/sysroot/bin/bash
useradd, /usr/sbin/useradd --> /mnt/sysroot/usr/sbin/useradd
複製命令所依賴的庫檔案至對應的目標目錄下。
/lib64/ld-linux-x8664.so.2 --> /mnt/sysroot/lib64/ld-linux-x8664.so.2
高階:每次複製完乙個命令後不退出,而是等待使用者鍵入新的需要複製的命令,直到使用者顯示輸入「quit」方可退出指令碼。
這個指令碼可以實現按需做根檔案系統,根檔案系統裡只有想要的程式和程式所使用到的庫檔案。
#!/bin/bash
##宣告2個陣列
declare -a ary
declare -a bry
#根目錄
sysroot=/tmp/sysroot
while [ true ]; do
read -p "enter a command or enter quit/q: " comm
[ $comm == "quit" -o $comm == "q" ] && break
#輸入的目錄不存在則退出
if ! which $comm &> /dev/null ; then
echo "command $comm is not exist!"
continue
fi#which有可能返回多個,所以用陣列接收結果
bry=(`which $comm`)
#取陣列bry的最後乙個元素的下標
lastidx=$[$-1]
#取陣列bry的最後乙個元素,最後乙個元素就是要copy的執行檔案的全路徑
last=$
#建立目錄後copy
pa=$
mkdir -p $sysroot$pa && cp $last $sysroot$pa/
#得到執行檔案所需要的所有庫檔案
ary=(`ldd $`)
#取得陣列ary的大小
asz=$
for ((i=0;i<$asz;i++)); do
tmp=$
#ldd得到結果放到了陣列,陣列裡的元素是用空格分隔,所以只有/開頭的元素才是庫檔案
if [ $ != "/" ]; then
continue
fi#建立目錄後copy
tpa=$
mkdir -p $sysroot$tpa && cp $tmp $sysroot$tpa/
echo $tmp
done
echo "done!"
done
# c/c++ 學習互助qq群:877684253
!(
bash 字串擷取
命令的2種替換形式 和 示例 截斷字串 a 擷取檔名稱 var1 basename home aimybbe bash test.sh echo var1 擷取目錄 var2 dirname home aimybbe bash test.sh echo var2 b var1 basename ho...
bash字串擷取 匹配
字串匹配特定起始 結尾 子串 1.指定字元匹配字串 去左留右,去右留左,不匹配則保留整個字串 string a a b c d d echo a b c d d echo d echo a a b c d echo a echo 提取 a 左側內容 a 2.指定位置擷取 左側0起始,右側0 1起始 ...
字串擷取和字串替換
substring 叫做擷取字串,split叫做字串分割 substring擷取,下面是從第0位擷取前3個 說白了是從第一位擷取前3個 中的0索引就是我們常說的第一位 列印結果 用一生 split擷取,下面是通過 擷取,把字元分為6部分 string txta 用,一,生,下,載,你 string ...