タグ付けされた質問 「variable-substitution」


3
コマンド置換を変数置換にネストできますか?
コマンドを介してアクセスする特定の文字列に変数置換を使用したいと思います。たとえば、クリップボードに何かをコピーすると、次のようにアクセスできます。 $ xclip -o -selection clipboard Here's a string I just copied. これを変数に割り当てると、変数の置換を行うことができます。 $ var=$(xclip -o -selection clipboard) $ echo $var Here's a string I just copied. $ echo ${var/copi/knott} Here's a string I just knotted. しかし、変数に代入せずに変数置換を行う方法はありますか?概念的には、このようなものです。 $ echo ${$(xclip -o -selection clipboard)/copi/knott} bash: ${$(xclip -o -selection clipboard)/copi/knott}: bad substitution …

2
設定されていない場合、先行コロンを作成せずにPATHのような変数に追加します
にディレクトリを追加する必要がありますPKG_CONFIG_PATH。通常、私は標準を使用します export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:$(pyenv prefix)/lib/pkgconfig しかし、PKG_CONFIG_PATH以前に私のシステム上で設定されていません。したがって、変数は:文字で始まり、現在のディレクトリを最初に検索するように指示します。それは欲しくない。私は以下に落ち着きました、 export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}${PKG_CONFIG_PATH:+:}$(pyenv prefix)/lib/pkgconfig しかし、それはとても醜いようです。もっと良い方法はありますか?変数がすでに設定されている場合にのみ、条件付きでコロンを追加する適切な方法は何ですか?

3
変数に格納されている引数をWGETに渡すにはどうすればよいですか
私は広範囲にwgetを使用するbashスクリプトを書いています。すべての共通パラメーターを1か所で定義するには、変数に格納します。これがコードの一部です。 useragent='--user-agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0"' cookies_file="/tmp/wget-cookies.txt" save_cookies_cmd="--save-cookies $cookies_file --keep-session-cookies" load_cookies_cmd="--load-cookies $cookies_file --keep-session-cookies" function mywget { log "#!!!!!!!!!# WGET #!!!!!!!!!# wget $quiet $useragent $load_cookies_cmd $@" wget $useragent $load_cookies_cmd "$@" } サッドが機能していません。どういうわけか、変数$ useragent、$ save_cookies_cmd、$ load_cookies_cmd、およびこれらの変数をパラメーターとして渡すcaling wgetにパラメーターを格納する正しい方法がありません。 次のような結果のコマンドラインが必要です。 wget --user-agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" --load-cookies /tmp/wget-cookies.txt …

10
Bash:IPv4アドレスの4つのセクションの1つを抽出します
構文${var##pattern}を使用して${var%%pattern}、IPv4アドレスの最後と最初のセクションを抽出できます。 IP=109.96.77.15 echo IP: $IP echo 'Extract the first section using ${var%%pattern}: ' ${IP%%.*} echo 'Extract the last section using ${var##pattern}: ' ${IP##*.} パラメータ拡張を使用してIPv4アドレスの2番目または3番目のセクションを抽出するにはどうすればよいですか? これが私の解決策です:配列を使用してIFS変数を変更します。 :~/bin$ IP=109.96.77.15 :~/bin$ IFS=. read -a ArrIP<<<"$IP" :~/bin$ echo ${ArrIP[1]} 96 :~/bin$ printf "%s\n" "${ArrIP[@]}" 109 96 77 15 また、私は使用して、いくつかのソリューションを書かれているawk、sedとcutのコマンドを。 さて、私の質問は:配列とIFS変更を使用しないパラメーター拡張に基づくより簡単な解決策はありますか?

2
Grepで正しい行を見つけ、sedで内容を変更してから、元のファイルに戻しますか?
ファイルの特定の行の1つの単語を変更しようとしていますが、すべてを一緒に接続するのに問題があります。 基本的に、ファイルの1行に「firmware_revision」というキーワードがあり、この行(およびこの行のみ)に「test」という単語を「production」という単語に置き換えたいと思います。 だから私はこれを行うことができます: grep 'firmware_revision' myfile.py | sed 's/test/production' これにより、必要な行が選択され、置換が実行されますが、この新しい行を元のファイルに入れて古い行を置き換える方法がわかりません。ファイルにリダイレクトすることはできないので、どうすればよいですか? 一時grepファイルを使用していても、を使用して必要な行だけを取得すると、ファイル内の他のすべてのデータが失われるため、すべてを一時ファイルにリダイレクトして元のファイルを一時ファイルに置き換えることはできなくなります。 編集-誰かが詳細情報を求めました このような行でいっぱいのファイルがあるとしましょう [ ('key_name1', str, 'value1', 'Description'), ('key_name2', str, 'value2', 'Description'), ('key_name3', str, 'value3', 'Description'), ('firmware_revision', str, 'my-firmware-name-test', 'Firmware revision name') ] ここで、「firmware_revision」を含む行を検索し、その行の「test」という単語のすべてのインスタンスを「production」に変更するスクリプト(理想的には1行)を記述したいと思います。「テスト」という単語がそのファイルの他の場所にある可能性があり、それらを変更したくありません。明確にするために、上の行を ('firmware_revision', str, 'my-firmware-name-production', 'Firmware revision name') どうすればよいですか?

2
パイピングbash文字列操作
私は他のいくつかのパイプbash文字列操作の質問を読みましたが、それらは特殊なアプリケーションのようです。 基本的に、以下をより簡単にする方法はありますか? の代わりに $ string='hello world'; string2="${string// /_}"; echo "${string2^^}" HELLO_WORLD 何かのようなもの $ echo 'hello world' | $"{-// /_}" | "${ -^^}" HELLO_WORLD 編集私は速度を維持するために可能であればbash操作内に留まることに興味があります(スクリプトを大幅に遅くする傾向があるsed / awkとは対照的に) Edit2:@jimmij 私は2番目の例が好きで、関数を作成することにしました。 bash_m() { { read x; echo "${x// /_}"; } | { read x; echo "${x^^}"; }; } echo hello world | bash_m …

5
Bash配列でのパラメーター置換の使用
Bash配列に読み込む必要があるfile.txtがあります。次に、スペース、二重引用符、およびすべてのエントリの最初のカンマを除くすべてを削除する必要があります。これが私がどこまで得たかです: $ cat file.txt 10,this 2 0 , i s 30,"all" 40,I 50,n,e,e,d,2 60",s e,e" $ cat script.sh #!/bin/bash readarray -t ARRAY<$1 ARRAY=( "${ARRAY[@]// /}" ) ARRAY=( "${ARRAY[@]//\"/}" ) for ELEMENT in "${ARRAY[@]}";do echo "|ELEMENT|$ELEMENT|" done $ ./script.sh file.txt |ELEMENT|10,this| |ELEMENT|20,is| |ELEMENT|30,all| |ELEMENT|40,I| |ELEMENT|50,n,e,e,d,2| |ELEMENT|60,se,e| コンマの状況を除いて、それは素晴らしい働きをします。この猫のスキンを作成する方法は複数あることは承知していますが、これは一部のスクリプトが大きいため、ここに到達するにはパラメーター置換を使用したいと思います。 |ELEMENT|10,this| |ELEMENT|20,is| |ELEMENT|30,all| |ELEMENT|40,I| …

1
リモートマシンで変数を使用してsshおよびシェルスクリプトでコマンドを実行する
リモートマシンにあるコマンドとスクリプトをローカルマシンのスクリプトで実行したいのですが。私はでこれらの種類のコマンドを実行することが可能であることを知っているsshので、私は作りました: #!/bin/bash ssh username@target 'cd locationOf/theScript/; ./myScript.sh' それは完全に動作します。変数を使用して、このスクリプトをより汎用的にしたいと思います。さて、それは: #!/bin/bash LOCATION=locationOf/theScript/ EXEC=myScript.sh ssh username@target 'cd ${LOCATION}; ./${EXEC}' そして私はこのエラーを受け取ります: bash: ./: is a directory リモートマシンはこれらの変数を認識していないと思います。それらをターゲットにエクスポートする方法はありますか?

3
bash $ {VAR // search / replace}と奇妙な正規表現の動作
$ {VAR // search / replace}パラメータ展開を使用して、変数を検索および置換しようとしています。私はかなり長くて邪悪なPS1を持っているので、拡張後のサイズを計算します。そのためには、そこに詰め込んだ一連のエスケープシーケンスを削除する必要があります。ただし、すべてのANSI CSI SGRシーケンスを削除しようとすると、構文の問題に遭遇しました。 私のPS1を考えると: PS1=\[\033]0;[\h] \w\007\]\[\033[1m\]\[\033[37m\](\[\033[m\]\[\033[35m\]\u@\[\033[m \]\[\033[32m\]\h\[\033[1m\]\[\033[37m\]\[\033[1m\])\[\033[m\]-\[\033[1m\](\[\033[m \]\t\[\033[37m\]\[\033[1m\])\[\033[m\]-\[\033[1m\](\[\033[m\]\[\033[36m\]\w\[\033[1m \]\[\033[37m\])\[\033[35m\]${git_branch}\[\033[m\]\n$ (はい、それは私が知っている病気です...) 私がやろうとしていること: # readability search='\\\[\\033\[[0-9]*m\\\]' # do the magic sane="${PS1//$search/}" しかし、これらは[0-9](ほとんどの[0-9]場合、.代わりにaのように扱われる)時点で貪欲であるようです: echo "${PS1//$search/}" \[\033]0;[\h] \w\007\]\n$ を削除して*に変更[0-9]すると[0-9][0-9](よりわかりやすくなります)、期待される結果に近づきます。 $ search='\\\[\\033\[[0-9][0-9]m\\\]' $ echo "${PS1//$search/}" \[\033]0;[\h] \w\007\]\[\033[1m\](\[\033[m\]\u@\[\033[m\]\h\[\033[1m \]\[\033[1m\])\[\033[m\]-\[\033[1m\](\[\033[m\]\t\[\033[1m\])\[\033[m\]-\[\033[1m \](\[\033[m\]\w\[\033[1m\])$(git_branch)\[\033[m\]\n$ なぜ*(ゼロ以上)クレイジーなことをしているのですか?ここで何か不足していますか?同じ正規表現をsedに渡すと、期待どおりの結果が得られます。 echo $PS1 | sed "s/$search//g" \[\033]0;[\h] \w\007\](\u@\h)-(\t)-(\w)$(git_branch)\n$
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.