我有一个很长的命令,我只想用它alias
来缩短它。但该命令包含单引号和感叹号。
原点命令是ldapsearch -x -H ... -w 'abc!123'
.
我尝试过alias search='ldapsearch -x -H ... -w \'abc!123\''
或者alias search="ldapsearch -x -H ... -w 'abc!123'"
等等。但它们都不适合我。
我有一个很长的命令,我只想用它alias
来缩短它。但该命令包含单引号和感叹号。
原点命令是ldapsearch -x -H ... -w 'abc!123'
.
我尝试过alias search='ldapsearch -x -H ... -w \'abc!123\''
或者alias search="ldapsearch -x -H ... -w 'abc!123'"
等等。但它们都不适合我。
不知何故,花引号进入了我的代码,我得到了意想不到的行为
#!/bin/sh
if [ foo = ‘foo’ ]; then
echo yes
else
echo no
fi
我希望这会回应“是”,但它会回应“否”。
我正在尝试在我的.bashrc
文件中定义以下 bash 函数:
function myfind() {
find $1 -not -path venv -not -path .tox -name "$2" | xargs grep -n "$3"
}
这不是我所期望的。当我使用该功能搜索文件中的文本时,例如
myfind . *.py test
它不返回任何东西。但是当我直接使用表达式时,即
find . -not -path venv -not -path .tox -name "*.py" | xargs grep -n "test"
它返回一些匹配项。
我已经尝试使用双引号,例如
function myfind() {
find $1 -not -path venv -not -path .tox -name '"$2"' | xargs grep -n '"$3"'
}
或者
function myfind() {
find $1 -not -path venv -not -path .tox -name "'$2'" | xargs grep -n "'$3'"
}
并试图逃避像
function myfind() {
find $1 -not -path venv -not -path .tox -name \"$2\" | xargs grep -n \"$3\"
}
但这些似乎都不起作用。
如何修复这个 bash 函数,以便在参数周围“使用”引号?
我创建了一个脚本来将 CSV 数据导出到 mysql 表。
#!/bin/bash
cd /data/NEW
for f in User*
do
mysql --user="root" --password="user@123" -e "LOAD DATA LOCAL INFILE '/data/NEW/"$f"' ignore into table new.table2 fields terminated by ',' enclosed by '"' lines terminated by '\n' (table_date, table_name, table_count);"
done
但我收到以下错误。但我找不到我在哪里搞砸了。
test.sh: line 6: unexpected EOF while looking for matching `''
test.sh: line 9: syntax error: unexpected end of file
有人可以告诉我哪里可以改进吗?
需要从文件中删除撇号。我尝试了几种方法,也来自Stackexchange。
我在 Synology NAS 上,所以我没有 Python 或 Perl,而且我必须排除某些目录(查找 -prune)。
以下 find 命令似乎在测试期间通常有效(使用 echo):
find . -depth \( -type d -name "@*" -o -name "*#recycle*" -o -name "*SynoResource*" -prune \) -o \( -name "*\'*" -execdir bash -c 'for f; do echo mv ${f/\\\'/\\\\'} `echo $f | sed 's/\\\'/X/g'`; done' _ {} + \)
对于像“911's.zip”这样的文件,将撇号 ' 替换为 X 会生成以下结果(使用上面的命令):
mv ./911's.zip ./911Xs.zip
当我删除“echo”以执行命令时,出现以下错误:
mv: target '911Xs.zip' is not a directory
在交互式 shell 中,我可以使用以下命令重命名文件:
mv 911\'s.zip 911Xs.zip
当然,我曾试图逃避 ' (即使有几个 \,如 in ${f/\'/X}
),但它不起作用。
任何想法?
非常感谢,
加里
为了这个问题,假设 glob/a/b/c/*
不产生匹配项。
这意味着以下测试应该失败(换句话说,它应该产生一个非零$?
):
[[ -n /a/b/c/*(#qN) ]]
如果我直接在 (zsh) 命令行上运行测试,实际上就是这种情况。但是,如果我在脚本中粘贴完全相同的测试,它会成功,这不是预期的行为。
如果我使用标志运行相同的脚本-x
,则生成的跟踪将测试显示为
[[ -n '/a/b/c/*(#qN)' ]]
我不明白为什么单引号出现在 test 的参数周围;在脚本的源代码中根本没有引号。
如果 zsh 自动插入这些单引号,这就解释了为什么文本会成功。
问题:
我正在寻找一种方法来转义包含格式说明符和特殊字符(如引号、反斜杠和换行符)的变量,以便在将其传递给print -P
它时会按字面意思打印出来。
所以基本上我希望这两个打印相同:
> cat file.txt
> my_var="$(cat file.txt)"
> print -P "${<magic>my_var}"
我使用的测试用例的一个很好的示例文件是:
Backslash \
Double Backslash \\
Single Quote '
Double Quote "
-----------------------
Escaped Linebreak \n
-----------------------
Color codes: %F{red}not red%f
Variable expansion $SHELL
我得到的最接近的是${${(q+)my_var}//\%/%%}
,尽管引号、换行符、反斜杠和变量扩展存在问题:
$'Backslash Double Backslash \
Single Quote '
Double Quote "
-----------------------
Escaped Linebreak \n
-----------------------
Color codes: %F{red}not red%f
Variable expansion /usr/bin/zsh'
我知道printf '%s\n' "$my_var"
。但是在实践中,print -P
变量周围有很多实际的格式,所以这对我没有用。print -P
遗憾的是,围绕变量和实际变量使用printf
也不起作用,因为在某些情况下,字符串操作被应用于变量的内容。
以下代码旨在查找~/Downloads
. 我用. ./script.sh
. 即使用户提交的名称不完整,它也会找到它们。
#!/usr/bin/bash
echo -e "\nGive me the name of a nonexitent directory and I will look for it in ~/Downloads?\n"
read word
TOGOs=("$(find ~/Downloads -maxdepth 1 -iname "*$word*" -type d -execdir echo {} + | sed 's;./;/home/smith/Downloads/;g')"
"")
for togo in ${TOGOs[@]}
do
if [[ $togo != "" ]]; then
echo $togo
export togo && cd $togo && return 0
else
echo "Haven't found it in ~/Downloads ." && cd ~/Downloads #This line does not work
fi
done
该if
部分按预期工作 - 当我给它一个名称/子目录名称的一部分时~/Downloads/
,但是else
当我给它一个不存在的目录时,该块的部分永远不会被执行。else
当我摆脱循环时,我可以执行该部分,如下所示:
#!/usr/bin/bash
echo -e "\nGive me the name of a nonexitent directory and I will look for it in ~/Downloads?\n"
read word
TOGO=$(find ~/Downloads -maxdepth 1 -iname "*$word*" -type d -execdir echo {} + | sed 's;./;/home/smith/Downloads/;g')
if [[ $TOGO != "" ]]; then
echo $TOGO
export TOGO
cd $TOGO && return 0
else
echo "Haven't found it in ~/Downloads." && cd ~/Downloads
fi
为什么else
当我摆脱循环时手臂会被执行?如何在保留循环的同时执行我的代码?
假设我们有几个在 shell 中使用时需要引用其名称的文件:
echo A > 'a.$A'
echo B > 'b.$B'
并且有一个 Makefile,其规则取决于这些文件:
all: a.$$A b.$$B
cat $+
以上内容适用于名称简单的文件,但适用于它生成的示例中的文件:
cat a.$A b.$B
cat: a.: No such file or directory
cat: b.: No such file or directory
看起来 shell 将$A
and$B
表达式扩展为空字符串。
如果我将变量引用为cat '$+'
,则会阻止扩展,但所有先决条件都作为单个参数传递:
cat 'a.$A b.$B'
cat: 'a.$A b.$B': No such file or directory
根据文档,这是一个单一参数的事实是可以预料的:
所有先决条件的名称 […],它们之间有空格。
问题是,有没有办法将所有先决条件作为单独的论据来引用它们?
编辑——不使用 bash
$1
变量。示例使用字段指示符:$1
,$2
,$3
是awk
输入记录字段 不幸的是,我做这个例子太快了,把例子弄混了。
我相信这是一个普遍的问题。我awk
用作演示工具。目的是将 ( awk
) 脚本参数暗示到awk
(或任何工具)命令中。
我们使用从 STDIN 到提供的字段awk
来产生结果。标识符$1
, $2
,$3
是awk
来自 STDIN 流的字段。
所需的解决方案 A(首选概念),例如...
#!/bin/bash -f
# script: blue.sh
#
awk -e '{ print $1 " and " $2 " silly example" ;}'
#
以及所需的输出:
$ echo "red blue yellow" > ./blue.sh
red and blue silly example
$
备选方案 B 可能被认为是:
#!/bin/bash -f
# script: green.sh
#
wrk="awk -e '{ print \$3 \" and \" \$2 \" variable example\" ;}' "
#
echo "work is:"
echo $wrk
echo
$wrk
以及所需的输出:
$ echo "red blue yellow" > ./green.sh
wrk is:
awk -e '{ print $3 " and " $2 " variable example" ;}'
yellow and blue variable example
$
问题出在表达式的引用中-e
。
有没有办法实现这两个例子?