スクリプトを使用したファイル権限の確認と変更

スクリプトを使用したファイル権限の確認と変更

私は初めてbashに触れ、スクリプトがうまくいくことはできません。これは私のコードです。

#!/bin/bash
file=~/scripts/text.txt

if [ -e $file ]
then echo "The file exists"

elif [ ! -e $file ]
then echo "The file does NOT exist"

fi

sleep 1s

if [ ! -w $file ]
then { sudo chmod u+w $file; } && { echo "The file is now writable"; }

elif [ -w $file ]
then echo "The file is already writable"
fi

スクリプトの上部では、ファイルが存在し、正しく機能していることを確認します。ファイルの書き込みが可能かどうかを確認する下部が部分的に機能します。ファイルの権限が変更されます。ただし、書き込み権限を有効にしても、「ファイルはすでに書き込むことができます」の代わりに「ファイルは書き込むことができます」というメッセージが表示され続けます。

私が言ったように、私は初めてbashに触れたので、助けてくれてありがとう。 ifステートメントの複雑さは私が現在知っている範囲を超えているので、簡単にしてください。

ベストアンサー1

奇妙なことは、ファイルsudoがホームディレクトリにあるにもかかわらず、ファイルの権限を変更するために使用することです。このファイルはあなたのものですか?chmod u+wファイル所有者にのみ書き込み権限を付与します。あなたが所有者なら、sudoは必要ありません。所有者でない場合は必ずしも必要ですsudoが、chmod u+w所有者に書き込み権限を付与するだけでは、ファイルに書き込む権限は付与されません。したがって、実行後もchmod u+wファイルに書き込むことはできません。これは[ -w … ]テストの結果です。

ls -l ~/scripts/text.txtファイルの所有権と権限を確認するには、実行してください。

それ以外の変数の置換には常に二重引用符を使用してください。 (またはすべてを学ぶことができます。ルールそして、すべてのルールを知らない人がスクリプトを維持するのを難しくしてください。 )迷惑なことに、シェル構文は$file「変数の値を取得します」をfile意味せず、「変数の値を取得してfileワイルドカードパターンリストに解析し、一致するファイルがある場合は一致するファイルのリストを使用することを意味します。パターンを交換してください。」二重引用符で置換が発生すると、この追加コンテンツは閉じられます。"$file"つまり、「変数の値を取得しますfile」を意味します。

また、これらの括弧はすべて必要ありません。

if [ ! -w "$file" ]
then
  sudo chmod u+w "$file" && echo "The file is now writable"
elif [ -w "$file" ]
then
  echo "The file is already writable"
fi

[ -w "$file" ]yes の負の値なので、その値に達すると[ ! -w "$file" ]テストelifは常に成功します。 (競合状態がない場合は、elif同じ条件を再テストするテストが異なる結果を返す可能性があるため、これはうまくいきません。)したがって、次のように単純化する必要があります。

if [ ! -w "$file" ]
then
  sudo chmod u+w "$file" && echo "The file is now writable"
else
  echo "The file is already writable"
fi

おすすめ記事