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


3
$()はサブシェルですか?
サブシェルの構文がであると理解していますが(<commands...>)、$()変数値を取得できるサブシェルにすぎませんか? 注:これは、ドキュメントのさまざまな表現に基づいてbash 4.4に適用されます。
51 bash  subshell  syntax 

4
if elseステートメントがlogicalおよび&&または||と同等 そして、どこよりもどちらを好むべきですか?
私は意思決定構造について学んでおり、これらのコードに出会いました: if [ -f ./myfile ] then cat ./myfile else cat /home/user/myfile fi [ -f ./myfile ] && cat ./myfile || cat /home/user/myfile 両方とも同じように動作します。ある方法を他の方法から使用する利点はありますか?


1
二重コロン「::」を含むBashスクリプト関数名
私は二重のコロンと関数名があるbashスクリプト今日出会った::それらの中に、例えば、file::write()とfile::read()。Bashスクリプトでこの構文を見たことがないので、スクリプトを呼び出したときは正常に実行されました(驚いたことに)。 私のシステム(およびオンライン)でBashのmanページを精査した後、関数名のこの構文をサポートするドキュメントで何も見つかりません。たとえば、このセクションでShell Defined Functionsは、シェル関数の構文を次のように定義しています。 function name [()] compound-command [redirection] そして(マニュアルのどこかで)トークンnameは次のように定義されます name A word consisting only of alphanumeric characters and underscores, and beginning with an alphabetic character or an underscore. Also referred to as an identifier. 関数名の二重コロン構文のどこにも言及はありません。 私がこれまでに見つけたこの二重コロン構文への唯一の他の参照は、このシェルスタイルガイド(サブセクションを参照Naming Conventions > Function Names)にありますmypackage::myfunction()。 この関数名の二重コロン構文はBashシェルの正当な機能ですか、それともおそらく文書化されていない機能ですか?合法である場合、Bashマニュアルのどこに記載されていますか?私は見て、見ましたが、マニュアルでそれについて何も見つけることができません。最も近いIましFOUNDはの使用である::内PATH検索パスに現在の作業ディレクトリを追加するための環境変数。 例 #!/bin/bash function abc::def() { echo "${FUNCNAME[0]}" } …

2
bashスクリプトで関数にパラメーターを渡す方法は?
多くの異なる変数を持つスクリプトから呼び出すことができる関数を書きたいです。いくつかの理由で、これを行うのに多くの問題を抱えています。例私が読んだことは常にグローバル変数を使用するだけですが、それは私が見ることができる限り私のコードをそれほど読みやすくしません。 使用例: #!/bin/bash #myscript.sh var1=$1 var2=$2 var3=$3 var4=$4 add(){ result=$para1 + $para2 } add $var1 $var2 add $var3 $var4 # end of the script ./myscript.sh 1 2 3 4 $1関数でなどを使用してみましたが、スクリプト全体が呼び出されたグローバルなものが必要になります。基本的に私が探しているようなものである$1、$2とそうではなく、関数のローカルコンテキストで。ご存じのように、関数は適切な言語で動作します。

6
シバン(スクリプト宣言)行が多すぎる-その量を減らす方法はありますか?
約20個の小さな.shファイルで構成されるプロジェクトがあります。一般に、20行を超えるコードを持つファイルはないため、これらを「小さい」と命名します。私はモジュール式のアプローチを採用しました。そのため、Unixの哲学に忠実であり、プロジェクトを維持しやすいからです。 各.shファイルの最初に、を入れました#!/bin/bash。 簡単に言えば、スクリプト宣言には2つの目的があることを理解しています。 これらは、ユーザーがファイルを実行するために必要なシェルを思い出すのに役立ちます(たとえば、ファイルを使用せずに数年後に)。 別のシェルが使用された場合の予期しない動作を防ぐために、特定のシェル(その場合はBash)でのみスクリプトが実行されるようにします。 プロジェクトが5ファイルから20ファイル、または20ファイルから50ファイルに成長し始めると(この場合ではなく、単に説明のため)、20行または50 行のスクリプト宣言があります。一部の人にとっては面白いかもしれませんが、プロジェクトごとに20または50を使用するのではなく、プロジェクトのメインファイルに20または50を使用するのは少し冗長に感じます。 いくつかのメインファイルで「グローバル」スクリプト宣言を使用して、この20または50の冗長性、またはスクリプト宣言の非常に多くの行を回避する方法はありますか?

1
whileループの入力リダイレクト演算子の順序を逆にできないのはなぜですか?
Bashでは、入力リダイレクト演算子をコマンドの前に移動できます。 cat <<< "hello" # equivalent to <<< "hello" cat なぜ同じことをwhileループにできないのですか? while read -r line; do echo "$line"; done <<< "hello" # hello <<< "hello" while read -r line; do echo "$line"; done # -bash: syntax error near unexpected token `do' whileループにパイプできるので、少しわかりにくいです。私は何か間違ったことをしていますか、それとも単なる設計上の決定でしたか?

2
なぜPOSIX Shell Grammarの開始中括弧の後に中括弧コマンドグループにスペースが必要なのですか?
TL; DR:POSIXブレースグループで{予約語の後にスペースが必要なのに、サブシェルでは予約語の後にスペースがないのはなぜ(ですか? POSIXシェル文法は、ブレースグループとサブシェルを次のように定義します brace_group : Lbrace compound_list Rbrace subshell : '(' compound_list ')' 今、それを文字通り読んでいる場合、スペースは重要です。これは、次のように開き中括弧と括弧を区切るスペースが必要であることを意味します { echo hello world; } ( echo hello world ) これは、複合コマンドの定義とも一致します。 これらの複合コマンドのそれぞれには、最初に予約語または制御演算子があり、最後に対応するターミネーター予約語または演算子があります。 ただし、意味がないのはなぜか(list)、問題なく機能する( list )(その後ろのスペース(は不要)が、ブレースの展開には先行スペースが必要である、つまり機能{echo hello;}しないためである。 もちろん、予約語がシェルワードとして扱われると、フィールド分割の概念に合わせるために後でスペースが必要になりますが、定義自体はスペースについて言及していません。さらに、複合コマンドのPOSIX定義で両方が予約語と見なされている場合{、(これらの予約語の後のスペース文字に関して、それらの扱いが異なるのはなぜですか?現在、ksh(1)のマニュアルには次のように記載されています。 文字のシーケンスである単語は、引用符で囲まれていない空白文字(スペース、タブ、および改行)またはメタ文字(<、>、|、;、&、(および))で区切られます。 言い換えると、kshが(最初の単語がコマンドまたは変数の割り当てである単語の区切り文字として認識することは理にかなっています。ただし、POSIXは(メタ文字として言及されていないようです。POSIX文法に関して私が見つけた唯一の可能な説明{は、「トークン」と見なさ(れるというものです。 /* These are reserved words, not operator tokens, and are recognized when reserved words are recognized. */ …
10 shell  posix  subshell  syntax 

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