1

Ubuntu 18
バッシュ 4.4.0

ディレクトリが存在するかどうかを確認するために if ステートメントを渡したいと思っています。もしそうなら、私はいくつかのコマンドとファイルをしたい. 同様の投稿を読みましたが、シェルチェックは私のフォーマットについて不平を言っています。

脚本:

#!/bin/bash

testing="yes"
scriptDir="/root/.work"
wDir="${scriptDir}/.nginx-fix"
if [ "$testing" = "no" ]; then
  hostfile="${scriptDir}/.zzz-hostnames"
else
  hostfile="${scriptDir}/.zzz-hostnames-tester"
fi

cd "$wDir"
while read fqdn; do
  { clear; echo ""; echo ""; echo "$hostname"; echo ""; }
  < /dev/null if ssh -p 34499 root@"${fqdn}" '[ -d /etc/nginx ]'; then
    < /dev/null ssh -p 34499 root@"${fqdn}" 'mv /etc/nginx/nginx.conf /etc/nginx/.nginx-sept-30'
    < /dev/null scp -P 34499 nginx.conf root@"${fqdn}":/etc/nginx
    < /dev/null ssh -p 34499 root@"${fqdn}" 'sed -i "/honeypot/d" /etc/nginx/conf.d/*.conf'
    < /dev/null ssh -p 34499 root@"${fqdn}" 'nginx -t'
  else
    exit 1;
  fi
done<"${hostfile}"

シェルチェックの苦情:

root@me ~/.work/.nginx-fix # shellcheck .nginx-fixer.sh

In .nginx-fixer.sh line 13:
while read fqdn; do
^-- SC1073: Couldn't parse this while loop.
                 ^-- SC1061: Couldn't find 'done' for this 'do'.


In .nginx-fixer.sh line 15:
        < /dev/null if ssh -p 33899 root@"${fqdn}" '[ -d /etc/nginx ]'; then
                                                                        ^-- SC1062: Expected 'done' matching previously mentioned 'do'.
                                                                            ^-- SC1072: Expected "#". Fix any mentioned problems and try again.

よろしくお願いします。

4

2 に答える 2

1

スクリプトをより明確なバージョンにリファクタリングし、次のものをすべて削除できます</dev/null

while read -r fqdn; do {
  { clear; echo ""; echo ""; echo "$hostname"; echo ""; }
  if ssh -p 34499 root@"${fqdn}" '[ -d /etc/nginx ]'; then
    ssh -p 34499 root@"${fqdn}" 'mv /etc/nginx/nginx.conf /etc/nginx/.nginx-sept-30'
    scp -P 34499 nginx.conf root@"${fqdn}":/etc/nginx
    ssh -p 34499 root@"${fqdn}" 'sed -i "/honeypot/d" /etc/nginx/conf.d/*.conf'
    ssh -p 34499 root@"${fqdn}" 'nginx -t'
  else
    exit 1;
  fi
} </dev/null; done < "${hostfile}"

目にはほとんど見えませんが、すべてのコマンドを内部do ... doneに配置しました{ .. } </dev/null。そうすれば、どのコマンドも から読み取られ${hostfile}ず、混乱しませんwhile read

別のオプションは、専用のファイル記述子を使用し、その番号を渡して読み取ることです。

while read -r -u 10 fqdn; do
  { clear; echo ""; echo ""; echo "$hostname"; echo ""; }
  if ssh -p 34499 root@"${fqdn}" '[ -d /etc/nginx ]'; then
    ssh -p 34499 root@"${fqdn}" 'mv /etc/nginx/nginx.conf /etc/nginx/.nginx-sept-30'
    scp -P 34499 nginx.conf root@"${fqdn}":/etc/nginx
    ssh -p 34499 root@"${fqdn}" 'sed -i "/honeypot/d" /etc/nginx/conf.d/*.conf'
    ssh -p 34499 root@"${fqdn}" 'nginx -t'
  else
    exit 1;
  fi
done 10<"${hostfile}"
于 2019-10-01T10:07:38.527 に答える