Bourne Shell Scripting - 简单的for循环语法

时间:2009-11-23 15:42:22

标签: shell unix scripting terminal sh

我对编程并不陌生,但我并不是很有经验。我想写一些小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美元1美元(1美元是用户键入的目录中的所有文件正确吗?)然后检查每个文件并显示每个文件的信息。我将如何开始和结束for循环(这是什么语法?)。

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

6 个答案:

答案 0 :(得分: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中读取三个字段并仅吐出第二个和第三个字段(它实际上是等效于cut -d, -f2,3 inputfile.csv的shell)

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

(注意:你不需要来恢复IFS,但我通常会确保脚本中的进一步文本处理在完成之后不会受到影响)。< / p>

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

./script.sh apple banana cherry date elderberry

然后变量$1将等于“apple”,依此类推。特殊参数$#是位置参数的计数,在这种情况下为5。

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

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

${@:2:1}

使用上面的示例给出“banana”。和

${@: -1}

${@:$#}

会给出最后一个(“接骨木”)。请注意,在此上下文中需要减号之前的空格。

答案 4 :(得分:1)

for x in "$@"; do
    echo "$x"
done

“$ @”保护所提供文件名中的任何空格。显然,你的实际工作取代了“echo $ x”,这并没有做太多。但$ @是脚本命令行提供的所有垃圾。

但是,如果$#不等于1,你的脚本就会失败,但你显然完全期待最多4个参数(因此你在脚本的早期部分引用了4美元)。

答案 5 :(得分:1)

假设您的系统上有GNU查找

find /path -type f -printf "filename: %f | hardlinks: %n| owner: %u | time: %TH %Tb %TY\n"