我对编程并不陌生,但我并不是很有经验。我想写一些小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编程。如果您有任何有用的网站或有更好的方法来解决这个问题,请告诉我!
答案 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>
for
和while
循环中有大量文档;只是谷歌: - )
答案 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"