2016-09-19 21 views
0

スクリプトを実行するMacOS端末に./test1.shを書き込むときは?端末でスクリプトを実行するプロセス

私は自分のマシンにoh-my-zshをインストールしていますので、端末にzshを実行します。そのような

実行test1.sh:

./test1.sh 

出力

1 март 2016/ 1 януари 2015/ 
1 март 2016/ 
./test3.sh: line 14: declare: -A: invalid option declare: usage: declare [-afFirtx] [-p] [name[=value] ...] 
./test3.sh: line 15: януари: syntax error: invalid arithmetic operator (error token is "?нуари") 
blah 

この

zsh test3.sh 

出力のようにそれを実行している間

1 март 2016/ 
1 януари 2015/ 
blah 

declare -A newarray 
newarray[януари]="1" 
qn="януари" 
echo ${newarray[$qn]} 

出力

1 

を実行している一方でそれはなぜですか?

test3.sh

# backup IFS 
SAVEIFS=$IFS 

# set IFS to newline 
IFS=$(echo -en "\n\b") 

# get files 
FILES=$(ls -1 -d */) 
echo ${FILES} 
IFS='\n' 
read dirsNameArray <<< ${FILES} 
echo ${dirsNameArray[0]} 

declare -A monthMap 
monthMap['януари']="1" 
# monthMap[февруари]="2" 
# monthMap[март]="3" 
# monthMap[април]="4" 
# monthMap[май]="5" 
# monthMap[юни]="6" 
# monthMap[юли]="7" 
# monthMap[август]="8" 
# monthMap[септември]="9" 
# monthMap[октомври]="10" 
# monthMap[ноември]="11" 
# monthMap[декември]="12" 


# iterate over files 
IFS='\n' 
for f in $FILES 
do 
    echo "blah" 
    IFS=' ' 
    # read -r dirNameArray <<< $f 
    # echo "${monthMap[${dirNameArray[2]}]}" 
    IFS='\n' 
done 

# restore $IFS 
IFS=$SAVEIFS 

答えて

0

はのは、テキストファイルを実行するために使用するものシェルzshのを見つけるしてみましょう:

% echo 'ps -f $$' > script.sh && chmod +x script.sh && ./script.sh 
UID  PID PPID C STIME TTY  STAT TIME CMD 
slim  17311 16570 0 15:45 pts/0 S+  0:00 sh ./script.sh 

は、だから、shを使用しています。それは意味をなさない、shは最小の共通分母、デフォルトのシェルです。

テキストファイルの1行目に#!を使用し、別のシェルを強制する:

% echo '#!/bin/zsh' > script.sh && echo 'ps -f $$' >> script.sh && chmod +x script.sh && ./script.sh 
UID PID PPID C STIME TTY  STAT TIME CMD 
slim 17342 16570 0 15:46 pts/0 S+  0:00 /bin/zsh ./script.sh 

#!は、汎用のメカニズムであるので、あなたは、標準入力から読み込み、ほとんど何を実行するためにそれを使用することができますし、 #で始まる "コメント"を無視します - perl、python、ほとんどのシェル、awk、gnuplotのようなものさえ。

+0

ありがとう私の男:)理にかなっています。 – mp3por

2

あなたは常にあなたのスクリプトでshebangを含める必要があります。

#!/bin/zsh 

これは、あなたのスクリプトが/bin/zsh(または他の何でも実行可能に指定して実行されることを保証する:あなたはあなたのシェルスクリプトは、zshによって実行させたい場合は、あなたの一番上の行のスクリプトがそのようになっていることを確認してくださいシバンで)。

あなたのスクリプトを実行するために使用されているもの殻を知りたい場合は、それに次の行を追加しますが:

ps ho cmd $$ 

、それが印刷さものを参照してください。どのシェルが対話セッションで使用されているか知りたい場合は、$BASH_VERSIONまたは$ZSH_VERSIONのいずれかが定義されているかどうかを確認してください。

+1

これが解決策であることに同意できます。それでも質問に答えない... – mp3por

+0

@ mp3porあなたの質問を誤解しました。私の更新された答えを見てください。 – redneb

関連する問題