我想使用以下表达式将数字写入变量
val=$(ls -al $1 | awk -v a=$i '{if( NR == a ) print $5}')
,但对于每个 i,它都会以类似的表达式返回 0,它会毫无问题地写入文件名
答案1
您似乎想打印当前目录中的第五个名称。
正确的方法是
shopt -s dotglob
set -- *
printf '%s\n' "$5"
这会将位置参数设置为扩展*
文件名通配模式所产生的列表(包括隐藏名称,因为我们还设置了dotglob
shell 选项)。第 5 个位置参数 ,$5
将保存按字典顺序排序在位置 5 的名称。如果目录包含的名称少于 5 个,则上面将打印一个空行。
名称是否包含空格、制表符或换行符并不重要。
要将名称分配给变量,请使用
val=$5
您是否想从当前目录之外的另一个目录的内容中选择名称,例如一个目录$dir
,然后用作"$dir"/*
模式。
您想要文件的大小而不是名称,然后使用stat
它:
stat -c %s "$5"
或者,要分配给变量,
val=$( stat -c %s "$5" )
上面假设 GNUstat
并会给出文件的大小(以字节为单位)(假设它存在)。
如果您想使用命名数组而不是破坏位置参数,请使用例如
names=( "$dir"/* )
"${names[4]}"
然后使用(数组从 shell 中的索引零开始)获取第五个名称bash
。