为什么shell for expression无法正确解析xargs参数

时间:2016-12-23 02:25:15

标签: shell for-loop xargs

我有一个黑名单来保存标签ID列表,例如1-3,7-9,实际上它代表1,2,3,7,8,9。并且可以通过下面的shell扩展它

for i in {1..3,7..9}; do for j in {$i}; do echo -n "$j,"; done; done
1,2,3,7,8,9

但首先我应该将-转换为..

echo -n "1-3,7-9" | sed 's/-/../g'
1..3,7..9

然后将其作为参数

放入for表达式中
echo -n "1-3,7-9" | sed 's/-/../g'  | xargs -I @ for i in {@}; do for j in {$i}; do echo -n "$j,"; done; done
zsh: parse error near `do'

echo -n "1-3,7-9" | sed 's/-/../g'  | xargs -I @ echo @
1..3,7..9

for表达式无法正确解析,为什么会这样?

3 个答案:

答案 0 :(得分:2)

因为您没有采取任何措施阻止最外层的shell获取特殊关键字和字符(dofor$等)oyu意味着要运行xargs

xargs不是内置的shell;它从参数中获取您希望它为stdin上的每个元素运行的命令行。就像任何其他程序一样,如果你想让;或任何其他特殊序列成为参数中的bash,你需要以某种方式逃避它。

在我看来,你真正想要的是在子shell中为每个输入元素调用一个命令(你的嵌套for循环)。

我想出了这个;它似乎在工作。

echo -n "1-3,7-9" \
| sed 's/-/../g'  \
| xargs -I @  \
bash -c "for i in {@}; do for j in {\$i}; do echo -n \"\$j,\"; done; done;"

给出了

{1..3},{7..9},

到目前为止,我认为这是你所希望的?

答案 1 :(得分:0)

可以使用下面的shell来实现这个

awk

但使用这种方式有点复杂,# awk echo "1-3,7-9,11,13-17" | awk '{n=split($0,a,","); for(i=1;i<=n;i++){m=split(a[i],a2,"-");for(j=a2[1];j<=a2[m];j++){print j}}}' | tr '\n' ',' 1,2,3,7,8,9,11,13,14,15,16,17,% 更直观

class A extends Model {
  public $first;
  public $b;
  public function __construct() {
    $this -> b = new B();
  }
}

class B extends Model {
  public $c;
  public function __construct() {
    $this -> c = new C();
  }
}

class C extends Model {
  public $foo;
}

答案 2 :(得分:0)

add_action( 'wp_enqueue_scripts', 'enqueue_unique_function_name_here', 0);
function enqueue_unique_function_name_here()
{
    wp_enqueue_style( 'css_unique_handle_name_here', get_stylesheet_directory_uri(). 'folder_path_inside_child_theme/style_sheet_file_name_here.css',  array(), '0.0.1' );
}