我正在尝试解析一个命令行参数列表(包含在特殊的"$@"
Bash变量中),该列表应传递给Linux ls
二进制文件。
参数可以选择包含-h
或--color
或--hide 'pattern'
等关键字参数,它们可以选择包含目录或文件路径(绝对/home
,相对{{1在任何位置都隐含相对./bin
}。
有没有办法从列表中提取位置路径参数(如果包含)?
如果不能合理地排除所有边缘情况,我们是否至少可以实现目标,并在线路上作为最后一个参数给出时提取路径参数?
如果它对上下文有帮助,我将在下一步中使用Documents
进一步处理路径参数,以通过向每一行附加更多信息来修改awk
的输出(相对于"show git branch in ls -l
" on Ask Ubuntu)。我有问题,如果我运行,例如ls -alF
,我在输出中有关于ls -alF /home
和./
的条目,../
将作为当前工作目录的相对路径处理,而不是指定{{1} }}
实际的脚本(Bash函数)可以在Ask Ubuntu上面的链接答案中找到。这是一个最小版本,它跳过调用外部awk
命令并解析其输出:
/home
示例输出(包含外部呼叫的原始功能):
git
现在,如果我当前的工作目录是lg (){
ls -alF "$@" |
awk '{
# Split into columns 1-8 and 9+ (file name):
match($0, /^(\S+\s+){8}(.+)$/, f);
# do something with the file name using an external command
# result is stored in b, e.g. "(master)" or an empty string
b=f[2];
print $0, b
}'
; }
来自上方(这是一个存储库)并且我像$ lg
total 48
drwxrwxr-x 12 bytecommander bytecommander 4096 Aug 26 14:48 ./
drwxr-xr-x 74 bytecommander bytecommander 4096 Aug 26 15:30 ../
drwxrwxr-x 6 bytecommander bytecommander 4096 Aug 26 14:43 git1/ (master)
drwxrwxr-x 7 bytecommander bytecommander 4096 Aug 26 14:42 git2/ (develop)
drwxrwxr-x 4 bytecommander bytecommander 4096 Aug 26 14:45 no-git/
-rw-rw-r-- 1 bytecommander bytecommander 0 Aug 26 14:42 regular-file
一样运行它,git1
输出中的lg /home
条目将正确对应./
,但我添加的存储库信息不正确是当前工作目录之一,即ls
。父目录条目/home
答案 0 :(得分:1)
如果你对perl没问题,那么我建议使用Getopt :: Long包来解析参数。这是一个示例:
#!/usr/bin/perl
use Getopt::Long;
my @args = @ARGV;
GetOptions(
'a' => \$opt{'a'},
'all' => \$opt{'all'},
'A' => \$opt{'A'},
'almost-all' => \$opt{'almost-all'},
'author' => \$opt{'author'},
'b' => \$opt{'b'},
'escape' => \$opt{'escape'},
'block-size=s' => \$opt{'block-size'},
# ...
'version' => \$opt{'version'}
)
or die "Invalid options: @args\n";
my @fileargs = @ARGV;
print "ls args: @args\n";
print "file args: @fileargs\n";
例如perl script.pl -a --author file1 file2
将打印ls args: -a --author file1 file2
file args: file1 file2
。您可以添加更多代码来处理文件参数。
至于相对路径名称问题:我建议运行find -maxdepth 1 fileordir
而不是ls fileordir
来获取绝对路径。
答案 1 :(得分:1)
到目前为止,我最好的猜测是你正在写一个剧本" myscript"你想称之为:
myscript -<ls-args> <path>
并在myscript内部执行:
ls "$@"
awk 'stuff' "${!#}"
如果这不是您正在寻找的内容,请编辑您的问题以澄清。