「ここでスクリプトを実行してください」

「ここでスクリプトを実行してください」

ある時点で、ディレクトリのすべての内容を一覧表示し、そのディレクトリから一部のコンテンツを収集する必要があるスクリプトを作成しようとしています。 lsではできません。私は私になる​​べき人ではありません。そのため、echoコマンドを使用してls操作を実行しようとしましたが、今度は許可拒否エラーが表示されます。以下のスクリプトを見ることができます。

#!/bin/sh
# Test for network connection

for interface in $(echo $(/sys/class/net/*) | grep -v lo);
do
  if [ "$(cat /sys/class/net/"$interface"/carrier)" = 1 ]; then
 OnLine=1;
 fi
done
if ! [ $OnLine ]; then echo "Not Online" > /dev/stderr;
 exit;
fi

次のエラーが発生します。

./carriercontrol.sh: line 10: /sys/class/net/apcli0: Permission denied

このスクリプトを完了するにはどうすればよいですか?ディレクトリのリストを取得してパイプに接続する方法はありますか?そして、その権限を削除することができますが、エコーはより多くの問題を引き起こすと思います。

編集する: echoをfindコマンドに置き換えようとしましたが、これは結果でありエラーです。

#!/bin/sh


# Test for network conection
for interface in $(find /sys/class/net -mindepth 1 | grep -v lo);
do
  if [ "$(cat /sys/class/net/"$interface"/carrier)" = 1 ]; then
 OnLine=1;
 fi
done
if ! [ $OnLine ]; then echo "Not Online" > /dev/stderr;
 exit;
fi

cat: can't open '/sys/class/net//sys/class/net/ra0/carrier': No such file or directory
cat: can't open '/sys/class/net//sys/class/net/eth0/carrier': No such file or directory
cat: can't open '/sys/class/net//sys/class/net/br-lan/carrier': No such file or directory
cat: can't open '/sys/class/net//sys/class/net/eth0.1/carrier': No such file or directory
cat: can't open '/sys/class/net//sys/class/net/apcli1/carrier': No such file or directory
cat: can't open '/sys/class/net//sys/class/net/apcli0/carrier': No such file or directory

ベストアンサー1

carrier以下のファイルを照会して、/sys/class/net/*/少なくとも1つがオンライン(無視)かどうかを示すかどうかを確認したいようです*/lo/carrier

シェルループを使用してください:

#!/bin/sh

online=0
for carrier in /sys/class/net/*/carrier; do
    case "$carrier" in
        */lo/carrier) continue ;;
    esac

    if read online <"$carrier" && [ "$online" -eq 1 ]; then
        break
    fi
done

if [ "$online" -ne 1 ]; then
    echo 'not online' >&2
    exit 1
fi

使用bash:

#!/bin/bash

shopt -s extglob

online=0
for carrier in /sys/class/net/!(lo)/carrier; do
    if read online <"$carrier" && [ "$online" -eq 1 ]; then
        break
    fi
done

if [ "$online" -ne 1 ]; then
    echo 'not online' >&2
    exit 1
fi

またはbash「ほぼ一行」で

#!/bin/bash

shopt -s extglob

grep -qx 1 /sys/class/net/!(lo)/carrier || ! echo not online >&2

最後の仮定は、オペレータがオンラインの場合はファイルに1桁の数字が含まれ1、オペレータがオンラインの場合はデータがないか、少なくともデータがないことです1

上記のループ(使用)は、readaが見つかるまで各ファイルの最初の行だけを読み取ります。carrier1


コードの問題はコマンドの置き換えです$(/sys/class/net/*)。これは、一致する最初のファイル名をコマンドとして実行し、別の一致するファイル名を引数として実行しようとします。

また、テストは[ $OnLine ]空でない限り「真」です。$OnLine演算子がオンラインでない場合、解析したファイルに何が含まれているのかわかりませんが、ここではゼロでも「真」と見なされます。

おすすめ記事