bash:通过if;then进行特殊字符检测(&`'''~/\[]$*;)

bash:通过if;then进行特殊字符检测(&`'''~/\[]$*;),bash,character,detection,Bash,Character,Detection,为此我绞尽脑汁好几天了,我已经尝试了很多解决方案。每个方法在stackoverflow上都有一定程度的效果,但每个方法都无法提取大多数特殊字符。 我对if检查的`[{字符不太在行 基本上,我想检测这些字符中是否有一个在文件名中&`''~/\[]$*;如果用户选择了一个文件,我将在代码中进行错误对话并退出0 我目前正在使用这个: STARTUPFILE="$(/usr/bin/osascript -e "tell application \"System Events\" to activate"

为此我绞尽脑汁好几天了,我已经尝试了很多解决方案。每个方法在stackoverflow上都有一定程度的效果,但每个方法都无法提取大多数特殊字符。 我对if检查的`[{字符不太在行

基本上,我想检测这些字符中是否有一个在文件名中&`''~/\[]$*;如果用户选择了一个文件,我将在代码中进行错误对话并退出0

我目前正在使用这个:

STARTUPFILE="$(/usr/bin/osascript -e "tell application \"System Events\" to activate" -e "tell application \"System Events\" to set thefile to choose file with prompt \"choose file \"" -e "do shell script (\"echo \"&(quoted form of POSIX path of thefile as Unicode text)&\"\")")"


FILENAME=$(basename "$STARTUPFILE") # via osascript input dialogue

if [[ $FILENAME = *[( & ` ´  ' " ~ / | \ [ ] $ * ; )]* ]]; then
除了只允许a-Z&0-9之外,检测所有这些参数的最佳方法是什么?

尝试以下方法:

if echo "$FILENAME" | grep -qe '^[a-zA-Z0-9]*$'; then
    echo "ok"
else
    echo "no"
fi

很接近;您只需要转义shell将特别处理的某些字符。必须省略空格,除非您也希望匹配空格字符

if [[ $FILENAME = *[\(\&\`´\'\"~/\|\\[]\$*\;\)]* ]]; then
将模式存储在变量中可能更简单:

pattern=$'*[(&`´\'"~/|\\[]$*;)]*'
if [[ $FILENAME = $pattern ]]; then
如果您只是尝试转义模式和正则表达式元字符,您可能只需要将%q格式与printf一起使用


谢谢大家,但到目前为止,除了将其限制为a-Z和0-9之外,没有其他效果,但我不得不反过来,允许使用特定的字符

如果有人想要,我会把答案贴在这里

我在早上尝试了一些事情,呵呵,我永远无法在晚上解决像这些编码这样的问题,并且让一些东西工作起来

是这样的:

if [[ $FILENAME = *['&''#''$''['']''\/''\'':''|'';''{''}''´''`''"''*''~'"'"]* ]]; then
除了在结尾处用双精度转义外,我几乎必须用''转义每个字符。正如chepner所提到的,/converts to:在OSX中,因此检查它是通过/和:,因此在代码中都是这样

到目前为止,只有这种方法有效

编写了一个用于检查某些文件名的小shell:

if [[ $FILENAME = *['&''#''$''['']''\/''\'':''|'';''{''}''´''`''"''*''~'"'"]* ]]
then
    echo FILENAME = "$FILENAME"  >> "/Users/zero/Desktop/text.txt"
    echo FILENAME does not pass character filter >> "/Users/zero/Desktop/text.txt"
    echo " " >> "/Users/zero/Desktop/text.txt"
else
    echo FILENAME = "$FILENAME"  >> "/Users/zero/Desktop/text.txt"
    echo FILENAME passes character filter >> "/Users/zero/Desktop/text.txt"
    echo " " >> "/Users/zero/Desktop/text.txt"
fi
这将提供以下日志输出:

FILENAME = _PI   something normal even with () quotes or - + _ .iso
FILENAME passes character filter

FILENAME = _PI  _ something.iso
FILENAME passes character filter

FILENAME = _PI  - something.iso
FILENAME passes character filter

FILENAME = _PI  ! something.iso
FILENAME passes character filter

FILENAME = _PI  ? something.iso
FILENAME passes character filter

 FILENAME = _PI  + something.iso
FILENAME passes character filter

FILENAME = _PI  # something.iso
FILENAME does not pass character filter

FILENAME = _PI ' something.iso
FILENAME does not pass character filter

FILENAME = _PI " something.iso
FILENAME does not pass character filter

FILENAME = _PI [ something.iso
FILENAME does not pass character filter

FILENAME = _PI ] something.iso
FILENAME does not pass character filter

FILENAME = _PI { something.iso
FILENAME does not pass character filter

FILENAME = _PI } something.iso
FILENAME does not pass character filter

FILENAME = _PI * something.iso
FILENAME does not pass character filter

FILENAME = _PI : something.iso
FILENAME does not pass character filter

FILENAME = _PI \ something.iso
FILENAME does not pass character filter

FILENAME = _PI & something.iso
FILENAME does not pass character filter

FILENAME = _PI ` something.iso
FILENAME does not pass character filter

FILENAME = _PI ´ something.iso
FILENAME does not pass character filter

FILENAME = _PI | something.iso
FILENAME does not pass character filter

FILENAME = _PI ~ something.iso
FILENAME does not pass character filter

FILENAME = _PI $ something.iso
FILENAME does not pass character filter

你也认为空间是一个特殊的字符吗?也试试回响{a.z },返回一个“^ ^”。[Z对我来说。为什么特别是这些字符?没有任何现有文件将包含/,因为这不是一个有效字符,忽略了这样一个事实,即OS X会将其默认更改为:但仍在Finder中显示为/,并且还有许多其他有效但同样奇怪的字符,您没有检查。@chepner:jut几乎每个字符都可以是在我列出的OSX文件名中使用,每个字符都是我想要避免的字符。Just:不允许出现在Finder中,而文件系统使用它自己的东西:正如你所说的。我只想过滤掉所有字符,因为osascript的输入对话返回的一些文件的名称中有&`''/\个字符。我知道这应该是很奇怪,但它根本不起作用,模式方法或直接在if中的检查都不起作用。我猜Finder和osascript的一些奇怪之处是造成这种情况的原因,或者它只是约塞米蒂打扰了我。我将尝试进行更多的试验。
FILENAME = _PI   something normal even with () quotes or - + _ .iso
FILENAME passes character filter

FILENAME = _PI  _ something.iso
FILENAME passes character filter

FILENAME = _PI  - something.iso
FILENAME passes character filter

FILENAME = _PI  ! something.iso
FILENAME passes character filter

FILENAME = _PI  ? something.iso
FILENAME passes character filter

 FILENAME = _PI  + something.iso
FILENAME passes character filter

FILENAME = _PI  # something.iso
FILENAME does not pass character filter

FILENAME = _PI ' something.iso
FILENAME does not pass character filter

FILENAME = _PI " something.iso
FILENAME does not pass character filter

FILENAME = _PI [ something.iso
FILENAME does not pass character filter

FILENAME = _PI ] something.iso
FILENAME does not pass character filter

FILENAME = _PI { something.iso
FILENAME does not pass character filter

FILENAME = _PI } something.iso
FILENAME does not pass character filter

FILENAME = _PI * something.iso
FILENAME does not pass character filter

FILENAME = _PI : something.iso
FILENAME does not pass character filter

FILENAME = _PI \ something.iso
FILENAME does not pass character filter

FILENAME = _PI & something.iso
FILENAME does not pass character filter

FILENAME = _PI ` something.iso
FILENAME does not pass character filter

FILENAME = _PI ´ something.iso
FILENAME does not pass character filter

FILENAME = _PI | something.iso
FILENAME does not pass character filter

FILENAME = _PI ~ something.iso
FILENAME does not pass character filter

FILENAME = _PI $ something.iso
FILENAME does not pass character filter