bashコマンドライン - sh -cの複数行を単一行に変換する方法

bashコマンドライン - sh -cの複数行を単一行に変換する方法

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. 上の大きなコードウィンドウのすべての改行文字をセミコロンに置き換えます。

個人的には1を選択します。

答え2

パラメータに含まれる改行には問題はありませんsh -c。代わりに構文(もう別のシェルでサポートされています){1..10}です。 on以外のものを出力する場合、これはPOSIX準拠違反であるため、新しいバージョンでそれを修正する準備をする必要があります。あなたはそれを使用することができます:zshshsh{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}

関連情報