我需要能夠備份,然后稍后將所有輸入引數用于 bash 程式,但無法弄清楚。這是我的嘗試:
back_up_all_input_args.sh:
#!/usr/bin/env bash
all_args1="$@"
all_args2="$(printf "%q " "$@")"
# Simulate parsing the input args here
# - see: https://stackoverflow.com/a/14203146/4561887
shift # remove 1st arg
shift # remove 2nd arg
echo "$@"
echo "$all_args1"
echo "$all_args2"
# Do another program call with all input args here
# rg "$all_args1" # FAILS
# rg "$all_args2" # FAILS
示例運行和輸出:
$ ./backup_all_input_args.sh arg1 "arg 2" "arg 3" arg 3 arg1 arg 2 arg 3 arg1 arg\ 2 arg\ 3
我的第一種方法是用all_args1="$@". 這失敗了,因為我丟失了引號并得到了arg1 arg 2 arg 3. 我的第二種方法是用all_args2="$(printf "%q " "$@")". 這失敗了,因為我再次丟失了引號,而且碰巧第一個引數不僅僅需要像檔案路徑一樣與反斜杠粘在一起,而是一個正則運算式引數,所以它需要保留真的沒有修改。因此,這不等于原始輸入:arg1 arg\ 2 arg\ 3 。
我已經研究過的參考資料
- 如何在 Bash 引數中保留引號?
- 如何在列印 bash 腳本的引數時保留引號
- 如何在 Bash 中決議命令列引數?
uj5u.com熱心網友回復:
添加括號并將它們存盤在陣列中。這將保留每個引數作為單獨的單詞并避免所有反斜杠轉義復雜性。
all_args=("$@")
然后,您可以訪問該陣列,例如:
printf '[%s]\n' "${all_args[@]}"
或者將它分配給另一個陣列:
args_copy=("${all_args[@]}")
您還可以使用set恢復腳本的原始的$1,$2等等,引數:
set -- "${all_args[@]}"
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/402746.html
標籤:
上一篇:在bash中的字母處剪切數字字串
下一篇:處理bash腳本中的特殊字符
