我正在尝试创建一个小脚本,它会在$2
目录中为我提供没有$3
首字母和$1
姓氏的文件名
我有这段代码
#!/bin/bash
TOTFILES=find "$1" -maxdepth 1 -type f -exec basename {} ';' | wc -l
find "$1" -maxdepth 1 -type f -exec basename {} ';' | sort |
head -n (( TOTFILES-$3 )) | tail -n (( TOTFILES-$3-$2 ))
我的主要问题是我不能用该长行的输出分配TOTFILES。
我认为如果我可以分配该值,它将起作用 (希望如此):)
PS: 我不知道我是否使用过
(( TOTFILES-$3 ))
是的,要获得价值。
感谢您的快速回答。
现在我遇到了一个新问题;我猜(( ))
不是获得号码的正确方法
./middleFiles: line 5: syntax error near unexpected token `('
./middleFiles: line 5: `find "$1" -maxdepth 1 -type f -exec basename {} ';' | sort | head -n (( TOTFILES-$3 )) | tail -n (( TOTFILES-$3-$2 ))'
答案 0 :(得分:3)
Command substitution分配命令的输出:
TOTFILES=$(find "$1" -maxdepth 1 -type f -exec basename {} ';' | wc -l)
Arithmetic expansion会告诉您head
和tail
的参数:
head -n $(( $TOTFILES - $3 ))
答案 1 :(得分:0)
我相信你需要围绕你想要评估的表达式进行反引号。
TOTFILES=`find "$1" -maxdepth 1 -type f -exec basename {} ';' | wc -l`
有关详细信息,请参阅this answer。
答案 2 :(得分:-2)
我认为最好的方法是将文件名分配给数组。根据您的代码,您只需要depth = 1
这么简单的ls
技巧就可以完成工作
#!/bin/bash
TOTFILES=($(ls -p $1 | grep -v / | sort -n)
# and you can use the array like this
for file in ${TOTFILES[*]};do
echo $file;
done
# leave you to get a subset of the ${ToTFILES}
# refer to http://stackoverflow.com/questions/1335815/how-to-slice-an-array-in-bash