我想知道以下内容;
非工作的例子
> ids=(1 2 3 4);echo ${ids[*]// /|}
1 2 3 4
> ids=(1 2 3 4);echo ${${ids[*]}// /|}
-bash: ${${ids[*]}// /|}: bad substitution
> ids=(1 2 3 4);echo ${"${ids[*]}"// /|}
-bash: ${"${ids[*]}"// /|}: bad substitution
Run Code Online (Sandbox Code Playgroud)
工作实例
> ids=(1 2 3 4);id="${ids[@]}";echo ${id// /|}
1|2|3|4
> ids=(1 2 3 4); lst=$( IFS='|'; echo "${ids[*]}" ); echo $lst
1|2|3|4
Run Code Online (Sandbox Code Playgroud)
在上下文中,用于sed命令的分隔字符串用于进一步解析.
通过以下方式从提示中轻松获取后台进程ID:
$ my_daemon &
$ echo $!
Run Code Online (Sandbox Code Playgroud)
但是,如果我想以不同的用户身份运行它,例如:
su - joe -c "/path/to/my_daemon &;"
Run Code Online (Sandbox Code Playgroud)
现在我如何捕获my_daemon的PID?
问题:需要解析一些可以按任何顺序排列的特定参数,non是可选的:-h -d -src -dst
我是Python的新手,并且已经查看过getopt和argparse之类的替代方案,但是无法获得一个工作示例,所以如下所示进行自定义;
argv=sys.argv[1:]
args=[]
for idx, arg in enumerate(argv):
# if is arg
if arg.startswith("-"):
# find arg match
for i in ("-h","-d:","-src:","-dst:"):
# requires var
if i == arg + ':' and idx < len(argv)-1:
if not argv[idx+1].startswith("-"):
args.append((arg,argv[idx+1]))
break
# no var
elif i == arg:
args.append((arg,""))
break
else:
continue
# may contain duplicates
print(args)
# no dupes
print(set(args))
Run Code Online (Sandbox Code Playgroud)
任何人都可以建议改进和/或更好的例子来实现问题目标吗?