2017-08-07 20 views
0

環境を切り替えることができるbash関数を作成しようとしていますが、以下は私が試したことです。関連するファイルをインラインで編集するためにnpm jsonパッケージをグローバルにインストールしましたが、それは必要ないかもしれません。bashで文字列変数を展開してJSONの値を切り替える

devUrl() { 'https://some-url.com'; } 
testUrl() { 'https://some-test-url.com'; } 
switchEnv() { 'json -I -f config.json -e "this.url = (this.url == "$1" ? "$2" : "$1")"'; } 
alias switch='switchEnv devUrl testUrl'; 

何が間違っていますか/間違っていますか?

私はとtestUrlの文字列をswitchEnv関数の二重引用符で囲んでテンプレートを作成しようとしましたが、それは止まってしまいました。

更新:

が、私はこれを試してみました:

devUrl='https://some-url.com' 
testUrl='https://some-test-url.com' 
switchEnv() { json -I -f config.json -e "this.url = (this.url == "$devUrl" ? "$testUrl" : "$devUrl")"; } 

が、次のエラーを得たが:

this.url = (this.url == https://some-url.com ? https://some-test-url.com : https://some-url.com) 
          ^

SyntaxError: Unexpected token : 
    at new Function (<anonymous>) 
    at main (/usr/local/lib/node_modules/json/lib/json.js:1289:27) 

それはいくつかの理由でのhttps後:が好きではありません。

+1

あなたは小さなものから始めようと自分の生活をはるかに簡単にすることができます。 "hello world"を印刷してビルドする機能を使用して、スクリプトを完成させ、それがなぜ機能していないのかをデバッグしようとするのではなく、 –

+0

あなたは '' $ devurl "'の引用符を* "* this.url'で始まる引用符付きの文字列として扱うので、動作しないリテラルと構文の引用符を混ぜています。 –

+0

使用している 'json'ツールのドキュメントへのリンクを提供できますか? –

答えて

1

以下は、お探しの実装例です。それがそのように実装された理由の詳細については、以下の注を参照してください。

# String assignments 
devUrl='https://some-url.com' 
testUrl='https://some-test-url.com' 
configFile="$PWD/config.json" 

# Functions 
switchEnv() { 
    local tempfile 
    tempfile=$(mktemp "$configFile.XXXXXX") 
    if jq --arg a "$1" \ 
     --arg b "$2" \ 
     'if .url == $a then .url=$b else .url=$a end' <"$configFile" >"$tempfile"; then 
    mv -- "$tempfile" "$configFile" 
    else 
    rm -f -- "$tempfile" 
    return 1 
    fi 
} 
switch() { switchEnv "$devUrl" "$testUrl"; } 

  • はエイリアスとは異なり、関数本体は、実際のコード、コードを含まない文字列でなければなりません。
  • (コードとは対照的に)データの格納は、変数を使用して行う必要があります(必要に応じて文字列または配列にする)。
  • コードから帯域外のデータを渡すと、悪意のある値のdevUrlまたはtestUrlが引用符をエスケープし、任意のjsonまたはjqコマンドを実行できます。これらの言語は時間の経過とともにより強力になるため、これは賢明です。旧バージョンのjqでは、一定時間で動作しない操作はありませんでしたが、現代バージョンの言語ではコードを使用して表現できるサービス拒否攻撃。将来のバージョンではI/Oサポートも追加され、悪意のあるコードにはさまざまな驚くべき動作が追加される可能性があります。

さて、あなたは、データとコードを分離することの重要性について、(上記の)警告を無視するつもりだったとしましょう。現在のコードを "正しく"動作するように変更するにはどうすればよいですか(扱う文字列が悪意のあるものではない場合)

switchEnv() { 
    json -I -f config.json -e 'this.url = (this.url == "'"$devUrl"'" ? "'"$testUrl"'" : "'"$devUrl"'")'; } 
} 
+0

進むjqの使用を開始します。 – devdropper87

関連する問題