web-dev-qa-db-ja.com

構文とベース名に関する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

1)basename $0がここでのスクリプト名を示していることを認識しています。しかし、どうやって?構文の説明をお願いします。 $0の意味?

2)どんな場合 ";"スクリプトのステートメントの最後で使用されていますか?たとえば、スクリプトの最初の行は;で終わります。 、8行目はそうではありません。また、一部の行の終わりにセミコロンを追加/削除すること(たとえば、1行目/ 6行目/ 8行目)は実際には意味がなく、スクリプトはそれがあってもなくても問題なく実行されることがわかりました。

2
Being Gokul

$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
4
terdon

$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と入力し、その後に改行します。この場合、$は検索時に特別な意味を持ち、この特別な意味を「エスケープ」するにはバックスラッシュが必要になるため、\$$として引用する必要があります。

どのような場合に「;」スクリプトのステートメントの最後で使用されていますか?

通常、1行に少なくとも2つのステートメントを配置する場合にのみ、たとえば、これは;を使用できる場合です。

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.
3