[英]Bash how to print out all the input arguments without using loop
我聽說bash中的循環是高效而復雜的。 因此,我嘗試制作一個腳本,以特定格式打印出所有參數,而不使用任何循環。
當我做
bash script_name arg1 arg2 arg3...
要么
./script_name arg1 arg2 arg3...
它應該輸出:
0: script_name
1: arg1
2: arg2
...
我嘗試使用$ @,但問題是它永遠不會打印出腳本名稱,並且我很難提出一種方法來打印出索引。
有人可以給我提示嗎? 謝謝
首先, $@
不包含腳本名稱,它僅包含實際的命令行參數。 您必須顯式打印$0
才能打印腳本名稱。
這是兩個解決方案:
exec paste -d: <(seq 0 $#;) <(printf ' %s\n' "$0" "$@";);
上面的代碼運行paste
實用程序以將(1)從0到由seq
實用程序生成的給定參數數量的數字序列粘貼在一起,以及(2)由printf
打印的腳本名稱和命令行參數,每個線。 每個seq
和printf
命令都在進程替換結構中運行,每個生成的設備文件代表傳遞給paste
的命令輸出(例如,我系統上的/dev/fd/63
)。
exec printf '%s\n' "$0" "$@"| awk '{ print(i++": "$0); };';
上面的代碼打印腳本名稱和命令行參數,每行一個,並將它們通過管道傳輸到awk
,后者會添加所需的編號前綴。
應該注意的是,這兩種解決方案中的每一種都涉及啟動至少一個額外的系統過程,以進行過程替換或流水線。 這是相當多保證是不是運行內置的for循環bash的,它不需要額外的過程更加低效(假設你只調用內置的東西在循環中,如printf
)。 通常,內置命令/關鍵字/構造幾乎總是比運行外部可執行文件快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.