Bash

如何使用 echo 為變數賦值但不在終端中顯示

  • January 14, 2022

我的 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

引用自:https://unix.stackexchange.com/questions/686329