0

我对编程并不完全陌生,但我并不完全有经验。我想写一个小的shell脚本来练习。

这是我到目前为止所拥有的:

#!/bin/sh
name=$0
links=$3
owner=$4
if [ $# -ne 1 ]
then
        echo "Usage: $0 <directory>"
        exit 1
fi
if [ ! -e $1 ]
then
        echo "$1 not found"
        exit 1

elif [ -d $1 ]
then
        echo "Name\t\tLinks\t\tOwner\t\tDate"
        echo "$name\t$links\t$owner\t$date"
        exit 0
fi

基本上我要做的是让脚本遍历指定目录中的所有文件,然后显示每个文件的名称以及它拥有的链接数量、它的所有者和它的创建日期。显示创建日期或至少显示文件最后修改日期的语法是什么?

另一件事是,创建 for 循环的语法是什么?据我了解,我必须在 $1 中编写类似 for $1 的内容($1 是用户输入的目录中的所有文件是否正确?),然后检查每个文件并显示每个文件的信息。我将如何开始和结束 for 循环(这是什么语法?)。

如您所见,我对 bourne shell 编程不是很熟悉。如果您有任何有用的网站或有更好的方法来解决这个问题,请告诉我!

4

6 回答 6

4

for 循环的语法:

for var in list
do
    echo $var
done

例如:

for var in *
do
    echo $var
done

但是,您可能要考虑的是这样的:

ls -l | while read perms links owner group size date1 date2 time filename
do
   echo $filename
done

它将输出动态拆分ls -l为字段,因此您无需自己进行任何拆分。

字段拆分由 shell 变量 IFS 控制,默认情况下包含空格、制表符和换行符。如果您在 shell 脚本中更改它,请记住将其更改回来。因此,通过更改 IFS 的值,您可以例如通过将其设置为逗号来解析 CSV 文件。此示例从 CSV 读取三个字段并仅吐出第二个和第三个字段(它实际上是 shell 的等效项cut -d, -f2,3 inputfile.csv

oldifs=$IFS
IFS=","
while read field1 field2 field3
do 
    echo $field2 $field3
done < inputfile.csv
IFS=oldifs

(注意:您不需要恢复 IFS,但我通常会确保在完成后不会影响脚本中的进一步文本处理)。

forwhile循环上有大量文档;只是谷歌它:-)

于 2009-11-23T15:50:36.507 回答
3

$1是第一个位置参数,$3第三个$4也是第四个。它们与启动脚本的目录(或其文件)无关。如果您的脚本是使用它启动的,例如:

./script.sh apple banana cherry date elderberry

那么变量$1将等于“apple”,依此类推。特殊参数$#是位置参数的计数,在本例中为 5。

脚本的名称包含在$0和中,$*并且$@是包含所有位置参数的数组,这些参数的行为取决于它们是否出现在引号中。

您可以使用子字符串样式的索引来引用位置参数:

${@:2:1}

将使用上面的示例给出“香蕉”。和:

${@: -1}

或者

${@:$#}

会给最后一个(“接骨木”)。请注意,在这种情况下,减号之前的空格是必需的。

于 2009-11-23T20:15:49.497 回答
2

您可能想查看Advanced Bash-Scripting Guide。它有一个解释循环的部分。

于 2009-11-23T15:47:15.437 回答
2

我建议find与选项一起使用-printf "%P\t%n\t%u\t%t"

于 2009-11-23T15:54:56.747 回答
1
for x in "$@"; do
    echo "$x"
done

"$@" 保护提供的文件名中的任何空格。显然,做你真正的工作来代替“echo $x”,它做的不多。但是 $@ 是命令行上提供给脚本的所有垃圾。

但是,如果 $# 不等于 1,您的脚本也会退出,但您显然完全期望最多 4 个参数(因此您在脚本的早期部分引用了 $4)。

于 2009-11-23T16:03:32.767 回答
1

假设你的系统上有 GNU find

find /path -type f -printf "filename: %f | hardlinks: %n| owner: %u | time: %TH %Tb %TY\n"
于 2009-11-23T16:19:10.723 回答