簡體   English   中英

Shell腳本中的ksh腳本+打印參數內容

[英]ksh script + print argument content in shell script

我想使用一個參數運行script.sh

如果第一個參數= action,那么script.sh將打印action參數- restart machine each 1 min

我的示例無法正常工作,但是請提出腳本中需要解決的問題,以便在參數為action打印$action參數。

備注我不想設置以下解決方案- [[ $1 = action ]] && echo action "restart machine each 1 min

我的示例腳本:

  #!/bin/ksh
  action="restart machine each 1 min"
  echo  "action" ${$1}

示例如何運行腳本

  ./script.sh action

我需要獲得的預期結果:

    action restart machine each 1 min

已經兩年了,但是這里有一個使用nameref (aka nameref typeset -N )的例子。 它包括三個連續的測試以驗證給定參數的有效性。

  1. 有爭論嗎?
  2. 參數是否與已知變量匹配? nameref進行檢查。
  3. 目標變量是否設置了值?
action='This is the value of $action'
word='This it the value of ${word}'
list='This is a list'
lie='This is a lie'

(
typeset name=${1:?Usage: script.sh varname} || exit 
nameref arg1=${name} || exit

: ${arg1:?} || exit

echo "$name $arg1"
)

您要使用eval:

action="restart machine each 1 min"
eval echo $1 \$$1

請注意,這樣做會帶來巨大的安全風險。 考慮如果用戶使用第一個參數“; rm -rf /”調用腳本會發生什么情況

您可以通過以下方法緩解此類問題:

eval "echo '$1' \"\$$1\""

但是實際上,您只是在自找麻煩(如果第一個參數包含雙引號,而$()構造將允許執行任意命令,則該最后一個版本將很困難)。 僅使用case語句並檢查參數是否與您要查找的字符串完全匹配要安全得多。 或者,至少檢查您要評估的參數是否不包含以下任何字符: ;()$"' 。最安全的方法是檢查其僅包含字母數字( a-zA-Z0-9

使用pdksh可以正常工作:

echo  "action" `eval echo '$'$1`

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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