web-dev-qa-db-ja.com

bashスクリプトで変数を設定できません

AppleScriptからスケジュールに従って実行されるbashスクリプトを使用して、毎晩自動的にフォルダーから新しいフォルダーへのファイルの移動を自動化しようとしています。 Mac OSXでbashスクリプトを作成しようとしていますが、失敗し続けます。要するに、これは私が持っているものです(私のechosはすべてエラーチェック用です):

#!/bin/bash
folder = "ABC"
useracct = 'test'
day = date "+%d"
month = date "+%B" 
year = date "+%Y"
folderToBeMoved = "/users/$useracct/Documents/Archive/Primetime.eyetv"
newfoldername = "/Volumes/Media/Network/$folder/$month$day$year"
ECHO "Network is $network" $network
ECHO "day is $day"
ECHO "Month is $month"
ECHO "YEAR is $year"
ECHO "source is $folderToBeMoved"
ECHO "dest is $newfoldername"
mkdir $newfoldername
cp -R $folderToBeMoved $newfoldername
if [-f $newfoldername/Primetime.eyetv];
    then rm $folderToBeMoved;
fi

さて、私の最初の問題は、変数をまったく設定できないことです。リテラルと同等にしたリテラルのものでさえ。すべてのechosが空白になります。日、月、年のいずれかを取得することもできません。同様に空白になります。

-fが見つからないというエラーが表示されます。

予期しないファイルの終わりがあるというエラーが表示されます。

ファイルを作成し、chmod u+x scriptname.sh

なぜ何も機能していないのかわかりません。 OSXでこのbashスクリプトを使用するのは初めてで、Windows vbscriptの経験しかありません。どんな助けも素晴らしいでしょう、ありがとう!

40
cohortq

Bashスクリプトでの割り当てでは_=_の周りにスペースを入れることはできません。おそらく、日付コマンドを バックティック $()

_#!/bin/bash
folder="ABC"
useracct='test'
day=$(date "+%d")
month=$(date "+%B")
year=$(date "+%Y")
folderToBeMoved="/users/$useracct/Documents/Archive/Primetime.eyetv"
newfoldername="/Volumes/Media/Network/$folder/$month$day$year"
ECHO "Network is $network" $network
ECHO "day is $day"
ECHO "Month is $month"
ECHO "YEAR is $year"
ECHO "source is $folderToBeMoved"
ECHO "dest is $newfoldername"
mkdir $newfoldername
cp -R $folderToBeMoved $newfoldername
if [-f $newfoldername/Primetime.eyetv]; then rm $folderToBeMoved; fi
_

最後の3行がコメント化されているため、この出力は次のとおりです。

_Network is 
day is 16
Month is March
YEAR is 2010
source is /users/test/Documents/Archive/Primetime.eyetv
dest is /Volumes/Media/Network/ABC/March162010
_
78
Isaac

5つの問題:

  1. 等号の前後にスペースを入れないでください。
  2. "$(...)"を使用して、コマンドの出力をテキストとして取得します。
  3. [はコマンドです。引数と引数の間にスペースを入れてください。
  4. コマンドでは大文字と小文字が区別されます。 echoが必要です。
  5. 変数を二重引用符で囲みます。 rm "$folderToBeMoved"

ここにあなたの修正されたスクリプトがあります

#!/bin/bash    
folder="ABC" #no spaces between assignment    
useracct='test'    
day=$(date "+%d") # use $() to assign return value of date command to variable    
month=$(date "+%B")     
year=$(date "+%Y")    
folderToBeMoved="/users/$useracct/Documents/Archive/Primetime.eyetv"    
newfoldername="/Volumes/Media/Network/$folder/$month$day$year"    
ECHO "Network is $network" $network    
ECHO "day is $day"    
ECHO "Month is $month"    
ECHO "YEAR is $year"    
ECHO "source is $folderToBeMoved"    
ECHO "dest is $newfoldername"    

mkdir "$newfoldername"    
cp -R "$folderToBeMoved" "$newfoldername"
if [ -f "$newfoldername/Primetime.eyetv" ]; then # <-- put a space at square brackets and quote your variables.
 rm "$folderToBeMoved";
fi
4
ghostdog74

folder = "ABC"は、引数=および"ABC"を使用して、folderという名前のコマンドを実行しようとします。 bashのコマンドの形式は次のとおりです。

command arguments separated with space

割り当ては以下で行われます:

variable=something

  • [ -f $newfoldername/Primetime.eyetv]では、[はコマンド(test)であり、-f$newfoldername/Primetime.eyetv]は2つの引数です。見つけることができない3番目の引数(])が必要なので(引数はスペースで区切る必要があります)、エラーが表示されます。
  • [-f $newfoldername/Primetime.eyetv]はコマンド[-fを引数$newfoldername/Primetime.eyetv]で実行しようとします

通常、このような場合は、コードを shellcheck に貼り付けて、フィードバックを確認してください。

4
Jahid