“在这里执行你的脚本”

“在这里执行你的脚本”

我正在尝试编写一个脚本,在某些时候我需要列出目录中的所有内容并从该目录中 grep 一些内容。我用ls做不到。 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 命令替换 echo ,这是结果和错误。

#!/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/*/,看看是否至少有一个表明您是否在线(忽略*/lo/carrier)。

使用 shell 循环:

#!/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

上面的循环(使用)将仅从每个文件read中读取第一行,直到找到 a 为止。carrier1


代码中的问题是命令替换$(/sys/class/net/*),它将尝试将第一个匹配的文件名作为命令执行,并将其他匹配的文件名作为参数。

此外,只要非空,测试[ $OnLine ]就为“true” 。$OnLine如果运营商不在线,我不确定您解析的文件包含什么,但这里即使是零也会被视为“true”。

答案2

这些单行话怎么样?即已grep明确排除环回。

GNU grep

注意:需要 GNUgrep 日期为 2001 年 3 月或之后。特别不适用于grepOpenWRT 中捆绑的 BusyBox。

grep -q --exclude '/sys/class/net/lo/carrier' 1 /sys/class/net/*/carrier || echo "not online" >&2

适用于较旧的 GNU grep 版本和非 GNU grep 的解决方案

例如 BusyBox 版本。

grep -x 1 /dev/null /sys/class/net/*/carrier|grep -qv /lo/ || ! echo 'not online' >&2

答案3

你可以尝试在sudo模式下执行上面的脚本

$须藤苏

“在这里执行你的脚本”

相关内容