簡體   English   中英

Bash如何在不使用循環的情況下打印出所有輸入參數

[英]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打印的腳本名稱和命令行參數,每個線。 每個seqprintf命令都在進程替換結構中運行,每個生成的設備文件代表傳遞給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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM