使用空格拆分/ proc/cmdline参数

hen*_*dry 9 shell parsing split cpu-word argument-passing

解析/ proc/cmdline的大多数脚本将其分解为单词,然后使用case语句过滤掉参数,例如:

CMDLINE="quiet union=aufs wlan=FOO"
for x in $CMDLINE
do
»···case $x in
»···»···wlan=*)
»···»···echo "${x//wlan=}"
»···»···;;
»···esac
done
Run Code Online (Sandbox Code Playgroud)

问题是WLAN ESSID有空格.用户希望设置wlan='FOO BAR'(就像一个shell变量),然后'FOO用上面的代码得到意想不到的结果,因为for循环在空格上分割.

是否有一种更好的方法来解析/proc/cmdlineshell脚本几乎没有评估它?

还是有一些引用技巧?我以为我可能会要求用户实体引用空格并解码如下:/bin/busybox httpd -d "FOO%20BAR".或者这是一个糟糕的解决方案?

Shr*_*m V 22

有一些方法:

  1. cat /proc/PID/cmdline | tr '\000' ' '

  2. cat /proc/PID/cmdline | xargs -0 echo

这些适用于大多数情况,但是当参数中包含空格时会失败.但是我确实认为有比使用更好的方法/proc/PID/cmdline.


小智 10

set -- $(cat /proc/cmdline)
for x in "$@"; do
    case "$x" in
        wlan=*)
        echo "${x#wlan=}"
        ;;
    esac
done
Run Code Online (Sandbox Code Playgroud)


Rai*_*tor 5

使用xargs -n1

[centos@centos7 ~]$ CMDLINE="quiet union=aufs wlan='FOO BAR'"
[centos@centos7 ~]$ echo $CMDLINE
quiet union=aufs wlan='FOO BAR'
[centos@centos7 ~]$ echo $CMDLINE | xargs -n1
quiet
union=aufs
wlan=FOO BAR

[centos@centos7 ~]$ xargs -n1 -a /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-3.10.0-862.14.4.el7.x86_64
root=UUID=3260cdba-e07e-408f-93b3-c4e9ff55ab10
ro
consoleblank=0
crashkernel=auto
rhgb
quiet
LANG=en_US.UTF-8
Run Code Online (Sandbox Code Playgroud)


lio*_*ori 1

豪华:

$ f() { echo $1 - $3 - $2 - $4 
> }
$ a="quiet union=aufs wlan=FOO"
$ f $a
quiet - wlan=FOO - union=aufs -
Run Code Online (Sandbox Code Playgroud)

您可以定义一个函数并将不带引号的$CMDLINE作为该函数的参数。然后您将调用 shell 的解析机制。请注意,您应该在它将运行的 shell 上对其进行测试 - zsh 通过引用做了一些有趣的事情;-)。

然后你可以告诉用户像在 shell 中一样进行引用:

#!/bin/posh
CMDLINE="quiet union=aufs wlan=FOO"
f() {
        while test x"$1" != x 
        do      
                case $1 in
                        union=*)        echo ${1##union=}; shift;;
                        *)              shift;; 
                esac    
        done    
}       
f $CMDLINE
Run Code Online (Sandbox Code Playgroud)

(豪华 - 符合策略的普通 SHell,剥离了标准 POSIX 之外任何功能的 shell)