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//\'/}。
关于如何解决这个问题的任何想法?
我有一个名为" 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切断了前面的空间,所以我不能说它是不同的.上面的第一种方式确实有效.
尝试使用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)
在运行命令之前有没有办法强制扩展?
通过例子解释问题......
证明 - 变量扩展后,--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) 假设我在 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) 在我的桌面上,有一个名为"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循环永远不会迭代.
为什么是这样?我错过了什么?
我在 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自己从来没有直接使用过,我在编写 …
假设我调用脚本与3个参数,a,abc和xyz这样的$@包含这些三个参数.
假设我想调用write命令:
command fooa fooabc fooxyz bara barabc barxyz
Run Code Online (Sandbox Code Playgroud)
我怎么做到这一点?
我认为{foo,bar}$@或{foo,bar}{$@}工作,因为大括号扩展在$@扩展之前发生.
我有一个具有以下条件的代码块,不知道它究竟是做什么的.
$var = "${args}_Some_Text"
if [ "${!var}" == '' ];then
echo "$var is not defined !!!"
fi
Run Code Online (Sandbox Code Playgroud) 我正在尝试首先为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吗?如果是这样,我该如何规避呢?
bash ×5
cmd ×2
arrays ×1
batch-file ×1
command-line ×1
double ×1
for-loop ×1
grep ×1
node.js ×1
powershell ×1
python-3.x ×1
quotes ×1
quoting ×1
shell ×1
snakemake ×1
windows ×1
zsh ×1