Bash
如何使用 echo 為變數賦值但不在終端中顯示
我的 bash 腳本
#!/bin/bash read -r -p "Enter the filenames: " -a arr for i in "${arr[@]}" do echo $i | sed 's/\(.*\)\..*/\1/' cp -v ~/Desktop/library/template.py "$i".py done
如果我寫
A B.py C D.py
,這個腳本會把它變成解釋正在做什麼的A.py B.py C.py D.py
-v
標誌cp -v
但我不想列印編輯後的文件名
echo $i
。這很煩人。我怎樣才能做到這一點?
替代解決方案也受到讚賞
我發現了一個竅門:
#!/bin/bash read -r -p "Enter the filenames: " -a arr for i in "${arr[@]}" do var=$(echo "$i" | sed 's/\(.*\)\..*/\1/') cp -v ~/Desktop/library/template.py "$var".py done
您想修剪
$i
字元串中最後一個點之後的值。你可以這樣做:
i=${i%.*}
這將刪除
$i
與文件名通配模式匹配的最短後綴字元串.*
(點後跟任何字元串)。如果您知道要
.py
特別修剪:i=${i%.py}
這意味著您可以
cp
像這樣編寫命令:cp -v ~/Desktop/library/template.py "${i%.py}.py"
這將是循環體中唯一的命令,如果值具有這樣的後綴,它將
.py
從 中刪除文件名後綴$i
,然後添加.py
. 這確保目標文件名始終具有.py
文件名後綴,同時避免後綴加倍。腳本建議:
#!/bin/sh for string do cp -v ~/Desktop/library/template.py "${string%.py}.py" done
或者,
#!/bin/zsh for string; cp -v ~/Desktop/library/template.py $string:r.py
…它使用
zsh
外殼,它的替代,更短的for
循環形式,以及它的修飾符在添加到名稱:r
之前刪除文件副檔名。.py
您可以像這樣呼叫任一腳本:
./script A B.py C D.py