在bash中检查目录的可读文件

在bash中检查目录的可读文件,bash,for-loop,ls,Bash,For Loop,Ls,我是Bash脚本新手,我一直在玩它,但我有一个我不理解的脚本: #!/bin/bash for name in $(ls $HOME) do if [ -f $name -a -r $name ] then echo "$name is file" fi done 如果我运行它,它不会打印任何东西。 我很确定我的主目录中有可读的文件。例: -rw-r--r-- 1 user user 368 feb 17 22:39 requiremen

我是Bash脚本新手,我一直在玩它,但我有一个我不理解的脚本:

#!/bin/bash
for name in $(ls $HOME)
do
    if [ -f $name -a -r $name ]
    then
        echo "$name is file"
    fi
done
如果我运行它,它不会打印任何东西。 我很确定我的主目录中有可读的文件。例:

-rw-r--r--  1 user user        368 feb 17 22:39 requirements.txt
如果我用另一个目录测试它,它会告诉我有两个可读的文件:

-rwxr-xr-x 1 user user  442 jul 27 23:47 longest-and-shortest-username.sh
-rwxr-xr-x 1 user user 1155 jul 28 00:39 options-for-files-in-directory.sh
我的Bash版本是:4.2.45(1)-发行版


我丢失了什么吗?

代码试图获取主目录中的文件名。但是,它正在测试当前目录中是否存在该名称(该目录必须是不同的)

解决方案是将目录附加到文件名。尝试:

for name in "$HOME"/*
do
    if [ -f "$name" -a -r "$name" ]
    then
        echo "$name is file"
    fi
done
上述方法还有一个额外的优点,即它可以用于带有空格的文件名和其他敌对字符的所有manor

bash
看到
$(ls$HOME)
时,它运行
ls$HOME
,然后对结果应用分词。因此,如果您有一个名为
my file
的文件,
bash
会将其分为两个参数
my
file
。你不会想要这个的。相反,当
bash
看到
$HOME/*
时,它返回所有未损坏的文件名


还请注意,我在
[-f“$name”-a-r“$name”]
中的
$name
周围加了双引号。这可以防止分词,并确保此测试对所有文件名都正常工作。

代码试图获取主目录中的文件名。但是,它正在测试当前目录中是否存在该名称(该目录必须是不同的)

解决方案是将目录附加到文件名。尝试:

for name in "$HOME"/*
do
    if [ -f "$name" -a -r "$name" ]
    then
        echo "$name is file"
    fi
done
上述方法还有一个额外的优点,即它可以用于带有空格的文件名和其他敌对字符的所有manor

bash
看到
$(ls$HOME)
时,它运行
ls$HOME
,然后对结果应用分词。因此,如果您有一个名为
my file
的文件,
bash
会将其分为两个参数
my
file
。你不会想要这个的。相反,当
bash
看到
$HOME/*
时,它返回所有未损坏的文件名


还请注意,我在
[-f“$name”-a-r“$name”]
中的
$name
周围加了双引号。这可以防止分词,并确保此测试对所有文件名都正常工作。

代码试图获取主目录中的文件名。但是,它正在测试当前目录中是否存在该名称(该目录必须是不同的)

解决方案是将目录附加到文件名。尝试:

for name in "$HOME"/*
do
    if [ -f "$name" -a -r "$name" ]
    then
        echo "$name is file"
    fi
done
上述方法还有一个额外的优点,即它可以用于带有空格的文件名和其他敌对字符的所有manor

bash
看到
$(ls$HOME)
时,它运行
ls$HOME
,然后对结果应用分词。因此,如果您有一个名为
my file
的文件,
bash
会将其分为两个参数
my
file
。你不会想要这个的。相反,当
bash
看到
$HOME/*
时,它返回所有未损坏的文件名


还请注意,我在
[-f“$name”-a-r“$name”]
中的
$name
周围加了双引号。这可以防止分词,并确保此测试对所有文件名都正常工作。

代码试图获取主目录中的文件名。但是,它正在测试当前目录中是否存在该名称(该目录必须是不同的)

解决方案是将目录附加到文件名。尝试:

for name in "$HOME"/*
do
    if [ -f "$name" -a -r "$name" ]
    then
        echo "$name is file"
    fi
done
上述方法还有一个额外的优点,即它可以用于带有空格的文件名和其他敌对字符的所有manor

bash
看到
$(ls$HOME)
时,它运行
ls$HOME
,然后对结果应用分词。因此,如果您有一个名为
my file
的文件,
bash
会将其分为两个参数
my
file
。你不会想要这个的。相反,当
bash
看到
$HOME/*
时,它返回所有未损坏的文件名


还请注意,我在
[-f“$name”-a-r“$name”]
中的
$name
周围加了双引号。这样可以防止分词,并确保此测试对所有文件名都能正常工作。

最好的方法是调试脚本,以便您能够识别问题:

#!/bin/bash
echo "Current directory is $PWD."
echo "HOME is $HOME."
for name in $(ls $HOME)
do
    echo "Checking $file."
    if [ -f $name -a -r $name ]
    then
        echo "$name is file"
    fi
done
以下是一些提示,但在发现问题的原因之前,请不要修改脚本

  • 将打开的变量用双引号对起来,以防止分词和路径名扩展
  • 首选
    [[]]
    而不是
    []
    ,因为它不进行分词和 路径名扩展
  • 可能不需要使用
    ls
    。您只需使用
    “$HOME”/*

  • 如果代码> ls 是必要的,考虑使用<代码>,同时读取具有进程替换的读< /COD>循环:<代码>,而IFS=读-R文件;做完成<最好的方法是调试脚本,以便识别问题:

    #!/bin/bash
    echo "Current directory is $PWD."
    echo "HOME is $HOME."
    for name in $(ls $HOME)
    do
        echo "Checking $file."
        if [ -f $name -a -r $name ]
        then
            echo "$name is file"
        fi
    done
    
    以下是一些提示,但在发现问题的原因之前,请不要修改脚本

    • 将打开的变量用双引号对起来,以防止分词和路径名扩展
    • 首选
      [[]]
      而不是
      []
      ,因为它不进行分词和 路径名扩展
    • 可能不需要使用
      ls
      。您只需使用
      “$HOME”/*

    • 如果代码> ls 是必要的,考虑使用<代码>,同时读取具有进程替换的读< /COD>循环:<代码>,而IFS=读-R文件;做完成<最好的方法是调试脚本,以便识别问题:

      #!/bin/bash
      echo "Current directory is $PWD."
      echo "HOME is $HOME."
      for name in $(ls $HOME)
      do
          echo "Checking $file."
          if [ -f $name -a -r $name ]
          then
              echo "$name is file"
          fi
      done
      
      以下是一些提示,但在发现问题的原因之前,请不要修改脚本

      • Enc