OSXコマンドラインには、次のようないくつかのロジックがあります。
for i in {1..10}
do
for j in {1..10}
do
echo "test inner"
done;
echo "test outer"
done
うまくいきます。しかし、で実行したいと思いますnohup
。だから、上記の内容を1行にまとめて合わせる必要があります。nohup sh -c "{a single line}"
ただし、次の行ではエラーが発生します。上記の改行文字をすべてスキップします。
sh -c 'for i in {1..10} do for j in {1..10} do echo "test inner" done; echo "test outer" done'
間違い:
sh: -c: line 0: syntax error near unexpected token `echo'
sh: -c: line 0: `for i in {1..10} do for j in {1..10} do echo "test inner" done; echo "test outer" done'
編集する:
コマンドの資格情報が保護されているため、ファイルとして実行したくありません。私が考える最も簡単な方法は、共有VMにファイルが残らないようにコマンドで実行することです。これが資格情報をどのくらい保護するのか、それとも良い方法があるのかわかりません。より多くの提案/アイデアを歓迎します。
編集する:
bashと一重引用符を使用して操作します。 (Tiggerの答えに基づいて)
bash -c 'for i in {1..10}; do for j in {1..10}; do echo "test inner"; done; echo "test outer"; done;'
答え1
私の考えには2つのオプションがあります。
- スクリプトファイルに入れて実行
- 上の大きなコードウィンドウのすべての改行文字をセミコロンに置き換えます。
個人的には1を選択します。
答え2
パラメータに含まれる改行には問題はありませんsh -c
。代わりに構文(もう別のシェルでサポートされています){1..10}
です。 on以外のものを出力する場合、これはPOSIX準拠違反であるため、新しいバージョンでそれを修正する準備をする必要があります。あなたはそれを使用することができます:zsh
sh
sh
{1..20}
echo {1..20}
zsh -c '
for i in {1..10}
do
for j in {1..10}
do
echo "test inner"
done
echo "test outer"
done'
または
sh -c '
i=1; while [ "$i" -le 10 ]
do
j=1; while [ "$j" -le 10 ]
do
echo "test inner"
j=$((j + 1))
done
echo "test outer"
i=$((i + 1))
done'
しかし、1つだけでできるコマンドを100個も実行することはecho
愚かなことのように感じられます。
awk 'BEGIN{
for (i=1; i<=10; i++) {
for (j=1; j<=10; j++)
print "test inner"
print "test outer"
}}'
必要に応じて1行に入れることができます。
awk 'BEGIN{for(i=1;i<=10;i++){for(j=1;j<=10;j++)print"test inner";print"test outer"}}'
答え3
一行に変換してみてください。;
正しい場所にいくつか追加しました。
for i in {1..10}; do for j in {1..10}; do echo "test inner ${j}"; done; echo "test outer ${i}"; done;
上記の行は機能しbash
ますが、実行するにはその範囲構文がサポートされていないため(私が知っている限り)sh -c
拡張する必要があります。この場合、次の行が私にとって効果的でした。{1..10}
sh
sh -c 'for i in 1 2 3 4 5 6 7 8 9 10; do for j in 1 2 3 4 5 6 7 8 9 10; do echo "test inner ${j}"; done; echo "test outer ${i}"; done;'
${j}
注:確認のために、およびを追加しました${i}
。