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

変数は、1つまたは複数の値を保持する、記号的な意味で正しく選択された場合の名前です。質問がシェルスクリプトでの変数の使用に固有の場合は、このタグを使用します(プログラミング言語の変数について質問する場合は、おそらくStackOverflowで質問する必要があります)

2
「」を含む文字列内に変数を挿入する方法は?
変数を挿入してxml文字列を作成したい: str1="Hello" str2="world" xml='<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>' echo $xml 結果は <?xml version="1.0" encoding="iso-8859-1"?><tag1>Hello</tag1><tag2>world</tag2> しかし、私が得るのは: <?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2> 私も試しました xml="<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>" しかし、それは内側の二重引用符を削除し、以下を与えます: <?xml version=1.0 encoding=iso-8859-1?><tag1>hello</tag1><tag2>world</tag2>
25 bash  shell  variable  xml 

4
1つの「while read」ループで変数がローカルになっているのに、一見似ているように見える別のループではないのはなぜですか?
$x以下のスニペットから異なる値を取得するのはなぜですか? #!/bin/bash x=1 echo fred > junk ; while read var ; do x=55 ; done < junk echo x=$x # x=55 .. I'd expect this result x=1 cat junk | while read var ; do x=55 ; done echo x=$x # x=1 .. but why? x=1 echo fred | …


5
[[]]テストで二重引用符を使用する理由
bashスクリプトに2つの整数があるとします。 value1=5 value2=3 次に、テストの場合に二重引用符を使用する必要があるのはなぜですか?例えば: if [[ "$value1" -eq "$value2" ]] なぜ次のものを使用しないのですか? if [[ $value1 -eq $value2 ]] 私にとって、二重引用符は意味をなさない。
23 bash  shell  quoting  variable  test 


3
引用符で囲まれた変数が空の場合、どうすれば何も展開できませんか?
スクリプトを実行しているとします: some-command "$var1" "$var2" ... そして、var1空のイベントでは、空の文字列の代わりに何も置き換えないで、実行されるコマンドが次のようになるようにします。 some-command "$var2" ... ではなく: some-command '' "$var2" ... 変数をテストして条件付きで含めるよりも簡単な方法はありますか? if [ -n "$1" ]; then some-command "$var1" "$var2" ... # or some variant using arrays to build the command # args+=("$var1") else some-command "$var2" ... fi bash、zshなどで何にも拡張できないパラメーター置換はありますか?残りの引数でグロビングを使用したい場合があるので、それを無効にして変数の引用符を外すことはオプションではありません。

4
dirnameおよびbasename vsパラメーター展開
ある形式を他の形式よりも優先する客観的な理由はありますか?パフォーマンス、信頼性、移植性? filename=/some/long/path/to/a_file parentdir_v1="${filename%/*}" parentdir_v2="$(dirname "$filename")" basename_v1="${filename##*/}" basename_v2="$(basename "$filename")" echo "$parentdir_v1" echo "$parentdir_v2" echo "$basename_v1" echo "$basename_v2" 生産物: /some/long/path/to /some/long/path/to a_file a_file (v1はシェルパラメーター展開を使用し、v2は外部バイナリーを使用します。)


5
パイプは変数を割り当てます
簡単にするために、次のことを行います。 echo cart | assign spo; echo $spo 出力:カート そのようなassignアプリケーションは存在しますか? 置換を使用してこれを行うすべての方法を認識しています。
19 bash  variable 

2
ヌル合体方式でのシェル変数の設定
私は、「ヌル合体」が本当に好きです。そこでは、変数を、物事のリストの最初の「非ヌル」値に設定できます。たとえば、多くの言語がこれをサポートしています。 C#: String myStr = string1 ?? string2 ?? "default"; JavaScript: var myStr = string1 || string2 || "default"; ...等。変数を設定するためにこれをBashで実行できるかどうか興味がありますか? 擬似: MY_STR=$ENV{VAR_NAME}??$ANOTHER_VAR??"default";
19 bash  shell  variable 

3
コマンドオプションにシェル変数を使用する
Bashスクリプトでは、使用するオプションをrsync別の変数に保存しようとしています。これは単純なオプション(など--recursive)に対しては正常に機能しますが、次の問題に直面してい--exclude='.*'ます: $ find source source source/.bar source/foo $ rsync -rnv --exclude='.*' source/ dest sending incremental file list foo sent 57 bytes received 19 bytes 152.00 bytes/sec total size is 0 speedup is 0.00 (DRY RUN) $ RSYNC_OPTIONS="-rnv --exclude='.*'" $ rsync $RSYNC_OPTIONS source/ dest sending incremental file list .bar foo sent …
19 bash  variable 

1
シェルで$ {$#}が$$と同じ結果を返すのはなぜですか?
最後の定位置パラメーターを設定しようとしている間に/bin/dash、試しましたecho ${$#}。驚いたことに、これはエラーにならず、$$変数の内容と同じPIDになりました。質問、なぜその構文が機能したのですか?ここでシェルが適用した構文規則は何ですか? 基本的に、私がしたことは $ set 1 2 3 4 5 $ echo ${$#} 13819 $ echo $$ 13819 どうやら、%文字もそのような構成では無視されます $ echo ${$%} 13819 しかし、*と@悪い置換誤りが発生: $ echo ${$*} sh: 10: Bad substitution $ echo ${$@} sh: 11: Bad substitution
18 shell  variable 

3
引用符で囲まれた変数のオプションが失敗するのはなぜですか?
私は、bfooで変数を引用する必要があることを読みました。たとえば、$ fooではなく「$ foo」です。しかし、スクリプトを書いているときに、引用符なしでは機能するが、引用符なしでは機能しないケースを見つけました。 wget_options='--mirror --no-host-directories' local_root="$1" # ./testdir recieved from command line remote_root="$2" # ftp://XXX recieved from command line relative_path="$3" # /XXX received from command line これは動作します: wget $wget_options --directory_prefix="$local_root" "$remote_root$relative_path" これはしません($ wget_optionsの前後の二重引用符に注意してください): wget "$wget_options" --directory_prefix="$local_root" "$remote_root$relative_path" この理由は何ですか? 最初の行は良いバージョンです。または、この動作の原因となる隠しエラーがあると疑うべきですか? 一般に、bashとその引用がどのように機能するかを理解するための優れたドキュメントはどこにありますか?このスクリプトを書いている間、私はルールを理解するのではなく、試行錯誤のベースに取り組み始めたと感じています。

6
実行時に変数を引用する必要がありますか?
シェルスクリプトの一般的なルールは、やむを得ない理由がない限り、変数を常に引用することです。あなたがおそらく知りたいと思うより多くの詳細については、この素晴らしいQ&Aを見てください:bash / POSIX shellsで変数を引用するのを忘れることのセキュリティの意味。 ただし、次のような関数を検討してください。 run_this(){ $@ } $@そこに引用されるべきかどうか?少し遊んでみましたが、引用符がないことが問題を引き起こすケースを見つけることができませんでした。一方、引用符を使用すると、引用符で囲まれた変数としてスペースを含むコマンドを渡すときに中断します。 #!/usr/bin/sh set -x run_this(){ $@ } run_that(){ "$@" } comm="ls -l" run_this "$comm" run_that "$comm" 上記のスクリプトを実行すると戻ります: $ a.sh + comm='ls -l' + run_this 'ls -l' + ls -l total 8 -rw-r--r-- 1 terdon users 0 Dec 22 12:58 da -rw-r--r-- 1 …

4
変数内の文字を置き換える最短の方法
変数内の文字を置き換えるには多くの方法があります。 私が見つけた最短の方法はtrこれまでのところです: OUTPUT=a\'b\"c\`d_123and_a_lot_more OUTPUT=$(echo "$OUTPUT"|tr -d "'\`\"") echo $OUTPUT もっと速い方法はありますか?そして、これは'、"および `のような引用に対して安全です?
18 bash  string  variable 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.