構文と基本名に関するBashシェルスクリプトの基本質問

構文と基本名に関するBashシェルスクリプトの基本質問

次のスクリプトを考えてみましょう。

myname=`basename $0`;
for i in `ls -A`
do
 if [ $i = $myname ]
 then
  echo "Sorry i won't rename myself"
 else
  newname=`echo $i |tr a-z A-Z`
  mv $i $newname
 fi
done

basename $01)これが私のスクリプト名を表すことを知っています。しかし、どのように?文法を説明してください。どういう意味ですか$0

2) スクリプトでは、ステートメントの最後に「;」はいつ使用されますか?たとえば、スクリプトの最初の行は;で終わります。 、8行目はそうではありません。また、特定の行(たとえば、1/6/8行)の末尾にセミコロンを追加/削除することは実際には意味がありません。スクリプトはセミコロンの有無にかかわらずうまく動作します。

答え1

$0内部bash変数です。からman bash

   0      Expands  to  the  name  of  the shell or shell
          script.  This is set at shell  initialization.
          If bash is invoked with a file of commands, $0
          is set to the name of that file.  If  bash  is
          started  with the -c option, then $0 is set to
          the first argument after the string to be exe‐
          cuted,  if  one  is present.  Otherwise, it is
          set to the file name used to invoke  bash,  as
          given by argument zero.

したがって、$0スクリプトのフルネームは です。たとえば、/home/user/scripts/foobar.sh通常、フルパスは必要なく、スクリプト自体の名前のみが必要なため、basenameパス削除を使用できます。

#!/usr/bin/env bash

echo "\$0 is $0"
echo "basename is $(basename $0)"

$ /home/terdon/scripts/foobar.sh 
$0 is /home/terdon/scripts/foobar.sh
basename is foobar.sh

;これは、同じ行に複数のステートメントを作成する場合、bashでのみ実際に必要です。あなたの例ではどこでも必要ありません。

#!/usr/bin/env bash

## Multiple statements on the same line, separate with ';'
for i in a b c; do echo $i; done

## The same thing on  many lines => no need for ';'
for i in a b c
do 
  echo $i
done

答え2

どういう意味ですか$0

man bash、セクションPARAMETERS、サブセクションSpecial Parameters

   0      Expands to the name of the shell or shell script.  This  is  set
          at shell initialization.  If bash is invoked with a file of com‐
          mands, $0 is set to the name of that file.  If bash  is  started
          with  the  -c option, then $0 is set to the first argument after
          the string to be executed, if one is present.  Otherwise, it  is
          set  to  the file name used to invoke bash, as given by argument
          zero.

そこと言われています0が、パラメータが識別された$0からです。$

検索キーを使用すると、マニュアルページでこの情報を簡単に見つけることができます/。入力/\$0してEnterキーを押します。この場合、$検索時に特別な意味があるので引用符で囲む必要があり、この特別な意味を「エスケープ」するにはバックスラッシュが必要です。\$$

スクリプトでステートメントの末尾に「;」が使用されるのはいつですか?

通常、1行に複数の文を入力したい場合にのみ、次のように使用できます;

if [ $i = $myname ]; then

サンプルスクリプトには;必須の大文字と小文字が含まれていないため、最初の行から削除できます。詳細をもう一度確認できますman bash

Lists
   A  list  is a sequence of one or more pipelines separated by one of the
   operators ;, &, &&, or ||, and optionally terminated by one of ;, &, or
   <newline>.

   [...]

   A sequence of one or more newlines may appear in a list  instead  of  a
   semicolon to delimit commands.

   If  a  command  is terminated by the control operator &, the shell exe‐
   cutes the command in the background in a subshell.  The shell does  not
   wait  for  the command to finish, and the return status is 0.  Commands
   separated by a ; are executed sequentially; the shell  waits  for  each
   command  to terminate in turn.  The return status is the exit status of
   the last command executed.

関連情報