标签: variable-expansion

Bash 引用当前路径 (pwd)

PWD当当前路径包含空格时,我遇到了一个最烦人的问题,该问题发生在变量上。我的代码看起来有点像这样:

mycommand |sed -E '  
 s|mystuff|replacement| ;  
 s|'$(pwd)'|replacement| ;  
 '
Run Code Online (Sandbox Code Playgroud)

这很好用,除非当前路径包含空格字符。如果是,$(pwd)则扩展为

'我的路径/有空间'
而不仅仅是
mypath/有空间

这会导致 sed 表达式混乱(因为额外的引号):

sed: 1: "s|mypath/with": 未终止的替代模式

我注意到,它不利于扩大PWD这样的:${PWD//\'/}

关于如何解决这个问题的任何想法?

bash variable-expansion

5
推荐指数
1
解决办法
3321
查看次数

bash:用空格扩展变量

我有一个名为" physics 1b.sh" 的文件.
在bash,如果我尝试

x="physics 1b"
grep "string" "$x".sh
Run Code Online (Sandbox Code Playgroud)

grep抱怨:

grep:  physics 1b: No such file or directory.
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做的时候

grep "string" physics\ 1b.sh 
Run Code Online (Sandbox Code Playgroud)

它工作正常.所以我猜这个问题与变量没有被扩展以包含grep需要识别空间的反斜杠有关.我如何让它工作?

使用bash 3.2,mac os 10.6.

编辑:
没关系,问题是x设置为" physics 1b",但当我 echo $x 检查内容时,bash切断了前面的空间,所以我不能说它是不同的.上面的第一种方式确实有效.

bash quotes double grep variable-expansion

4
推荐指数
1
解决办法
6722
查看次数

调用其他程序时的Powershell变量扩展

尝试使用7za Powershell中的命令行实用程序解压缩文件时遇到一个小问题.

我将$zip_source变量设置为zip文件的路径和 $unzip_destination所需的输出文件夹.

但是,7za需要参数的命令行用法指定如下:

7za x -y <zip_file> -o<output_directory>
Run Code Online (Sandbox Code Playgroud)

所以我目前的电话看起来像这样:

& '7za' x -y "$zip_source" -o$unzip_destination
Run Code Online (Sandbox Code Playgroud)

由于-o目标之间不存在空间,因此PowerShell似乎不会扩展$unzip_destination变量,而是$zip_source扩展.

目前,程序只是将所有文件提取到C:\名为的文件夹的根目录中$unzip_destination.在变量周围设置不同类型的引号既不起作用:

-o"$unzip_destination" : still extracts to C:\$unzip_destination
-o'$unzip_destination' : still extracts to C:\$unzip_destination
-o $unzip_destination  : Error: Incorrect command line
Run Code Online (Sandbox Code Playgroud)

在运行命令之前有没有办法强制扩展?

powershell variable-expansion

4
推荐指数
2
解决办法
2582
查看次数

变量处理的bash引号在扩展为命令时处理不同

通过例子解释问题......

证明 - 变量扩展后,--chapters之后的单引号会被转义(我没想到):

prompt@ubuntu:/my/scripts$ cat test1.sh
#!/bin/bash
actions="--tags all:"
actions+=" --chapters ''"
mkvpropedit "$1" $actions

prompt@ubuntu:/my/scripts$ ./test1.sh some.mkv
Error: Could not open '''' for reading.
Run Code Online (Sandbox Code Playgroud)

现在由于某种原因,mkvpropedit接收双引号作为文件名的一部分(我也没想到):

prompt@ubuntu:/my/scripts$ cat test1x.sh
#!/bin/bash
command="mkvpropedit \"$1\""
command+=" --tags all:"
command+=" --chapters ''"
echo "$command"
$command

prompt@ubuntu:/my/scripts$ ./test1x.sh some.mkv
mkvpropedit "some.mkv" --tags all: --chapters ''
Error: Could not open '''' for reading.
Run Code Online (Sandbox Code Playgroud)

上面的echo'd命令似乎是正确的.将相同的文本放在另一个脚本中会得到预期的结果:

prompt@ubuntu:/my/scripts$ cat test2.sh
#!/bin/bash
mkvpropedit "$1" --tags all: --chapters ''

prompt@ubuntu:/my/scripts$ ./test2.sh some.mkv
The file is being analyzed.
The changes are …
Run Code Online (Sandbox Code Playgroud)

bash quoting variable-expansion

4
推荐指数
1
解决办法
683
查看次数

如何在zsh中扩展数组的元素?

假设我在 zsh 中有一个数组

a=(1 2 3)
Run Code Online (Sandbox Code Playgroud)

我想附加.txt到每个元素

echo ${a}.txt # this doesn't work
Run Code Online (Sandbox Code Playgroud)

所以输出是

1.txt 2.txt 3.txt
Run Code Online (Sandbox Code Playgroud)

更新:

我想我可以做到这一点,但我认为有一种更惯用的方式:

for i in $a; do
    echo $i.txt
done
Run Code Online (Sandbox Code Playgroud)

arrays zsh variable-expansion

4
推荐指数
1
解决办法
1317
查看次数

Windows CMD批处理:具有DelayedExpansion的FOR/R

在我的桌面上,有一个名为"test"的文件夹.在这个文件夹里面有两个文件,"file1.txt""file2.txt".

看看这个简单的批处理脚本:

@ECHO OFF

SET test="C:\Users\Tyler\Desktop\test"

ECHO %test%
FOR /R %test% %%F IN (*) DO (
    ECHO %%F
)
Run Code Online (Sandbox Code Playgroud)

正如您所料,它输出以下内容:

"C:\Users\Tyler\Desktop\test"
C:\Users\Tyler\Desktop\test\file1.txt
C:\Users\Tyler\Desktop\test\file2.txt
Run Code Online (Sandbox Code Playgroud)

现在来看看这个变化:

@ECHO OFF

SETLOCAL ENABLEDELAYEDEXPANSION

SET test="C:\Users\Tyler\Desktop\test"

ECHO !test!
FOR /R !test! %%F IN (*) DO (
    ECHO %%F
)

ENDLOCAL
Run Code Online (Sandbox Code Playgroud)

我希望它的输出没有什么不同.但是,这里是:

"C:\Users\Tyler\Desktop\test"
Run Code Online (Sandbox Code Playgroud)

它似乎在线上!test!扩展ECHO !test!,但不FOR /R !test!在线,变得公正!test!.因为那当然不是有效路径,FOR/R循环永远不会迭代.

为什么是这样?我错过了什么?

command-line for-loop cmd batch-file variable-expansion

4
推荐指数
1
解决办法
2448
查看次数

有没有办法防止 Windows 命令行中 env 变量的百分比扩展?

我在 Windows 上的 git bash 中使用以下 git 命令:

git log --format="%C(cyan)%cd%Creset %s" --date=short -5
Run Code Online (Sandbox Code Playgroud)

它显示提交日期 ( %cd),后跟提交消息 ( %s)。提交日期用颜色标记包裹:%C(cyan)开始彩色输出和%Creset停止彩色输出。

虽然它在 git bash 中运行良好,但它不适用于cmd:%cd%被 Windows shell 扩展到当前工作目录(相当于$PWD在 bash 中)。

因此,当该命令通过 运行时cmd,我看到当前工作目录显示而不是第一列中的提交日期! git bash:

2015-10-08 commit msg
2015-10-08 commit msg
2015-10-07 commit msg
2015-10-06 commit msg
2015-10-06 commit msg
Run Code Online (Sandbox Code Playgroud)

指令:

D:\git\someFolderCreset commit msg
D:\git\someFolderCreset commit msg
D:\git\someFolderCreset commit msg
D:\git\someFolderCreset commit msg
D:\git\someFolderCreset commit msg
Run Code Online (Sandbox Code Playgroud)

实际上,我cmd自己从来没有直接使用过,我在编写 …

windows cmd variable-expansion node.js

4
推荐指数
1
解决办法
1398
查看次数

用$ @参数支持扩展

假设我调用脚本与3个参数,a,abcxyz这样的$@包含这些三个参数.

假设我想调用write命令:

command fooa fooabc fooxyz bara barabc barxyz
Run Code Online (Sandbox Code Playgroud)

我怎么做到这一点?

我认为{foo,bar}$@{foo,bar}{$@}工作,因为大括号扩展在$@扩展之前发生.

bash variable-expansion brace-expansion

4
推荐指数
1
解决办法
128
查看次数

"$ {!var}"在shell脚本中的含义是什么?

我有一个具有以下条件的代码块,不知道它究竟是做什么的.

$var = "${args}_Some_Text"
if [ "${!var}"  == '' ];then
     echo "$var is not defined !!!"
fi 
Run Code Online (Sandbox Code Playgroud)

bash shell variable-expansion

4
推荐指数
1
解决办法
3989
查看次数

如何在Snakemake中进行部分扩展?

我正在尝试首先为LETTERS x NUMS组合生成4个文件,然后通过NUMS进行汇总,以获得LETTERS中每个元素的一个文件:

LETTERS = ["A", "B"]
NUMS = ["1", "2"]


rule all:
    input:
        expand("combined_{letter}.txt", letter=LETTERS)

rule generate_text:
    output:
        "text_{letter}_{num}.txt"
    shell:
        """
        echo "test" > {output}
        """

rule combine text:
    input:
        expand("text_{letter}_{num}.txt", num=NUMS)
    output:
        "combined_{letter}.txt"
    shell:
        """
        cat {input} > {output}
        """
Run Code Online (Sandbox Code Playgroud)

执行此snakefile会导致以下错误:

WildcardError in line 19 of /tmp/Snakefile:
No values given for wildcard 'letter'.
  File "/tmp/Snakefile", line 19, in <module>
Run Code Online (Sandbox Code Playgroud)

似乎部分expand是不可能的.这是一个限制expand吗?如果是这样,我该如何规避呢?

variable-expansion python-3.x snakemake

3
推荐指数
2
解决办法
918
查看次数