我要写一个bash脚本,它返回一个给定的PDF文件列表中的标题和文档类型以及其他一些东西。所以我试图编写一个函数来获取文档类型。当文档类型为ACM或MIT时,它可以正常工作,但是当输出处于elif块时,它会显示“未找到命令”。我的代码在这里 -
#!/bin/bash
function get_type(){
if less "$1" | grep -q -i "ACM TRANSACTIONS"
then
type="ACM Transactions"
elif less "$1" | grep -q -i "journal homepage: www.elsevier.com"
then
type= "ELSEVIER"
elif less "$1" | grep -q -i "IEEE TRANSACTIONS"
then
type= "IEEE Transactions"
else
type="MIT Press"
fi
echo $type
}
for file in ~/Desktop/1105063/papers/*;
do
get_type "$file"
done
这是输出 -
shawon@Shawon-Linux:~/Desktop/1105063$ ./test.sh
./test.sh: line 12: IEEE Transactions: command not found
[...]
答案 0 :(得分:5)
请注意,在shell中,空格通常用shell术语来区分 words 。 =
符号周围的变量赋值中不得有空格。使用
type="IEEE Transactions"
,因为
type= "IEEE Transactions"
是使用空字符串向type
的一次性赋值,然后尝试执行IEEE Transactions
命令(显然不存在)。
答案 1 :(得分:1)
在分配前删除空格。
type= "ELSEVIER"
此外,将命令放在括号内是一个好习惯:
if ( less "$1" | grep -q -i "ACM TRANSACTIONS" )
答案 2 :(得分:1)
建议:
#!/bin/bash
function get_type(){
if grep -q -i "ACM TRANSACTIONS" "$1"; then
type="ACM Transactions"
elif grep -q -i "journal homepage: www.elsevier.com" "$1"; then
type="ELSEVIER"
elif grep -q -i "IEEE TRANSACTIONS" "$1"; then
type="IEEE Transactions"
else
type="MIT Press"
fi
echo "$type"
}
for file in ~/Desktop/1105063/papers/*; do
get_type "$file"
done
答案 3 :(得分:0)
你可以避免使用开关构造的elif。
不是最好的示例case
如何工作,您需要将var转换为小写,并使用反斜杠转义所有空格。
#!/bin/bash
function gettype {
# echo "Debug: Input $1"
typeset -l x
x=$1
# echo "Debug: x=$x"
case "$x" in
*acm\ transactions*) echo "ACM Transactions" ;;
*journal\ homepage:\ www.elsevier.com*) echo "ELSEVIER" ;;
*ieee\ transactions*) echo "IEEE Transactions" ;;
*) echo "MIT Press" ;;
esac
}
# Some test-calls
gettype "String with acm transActions"
gettype "String without transActions written complete"
gettype "String with the journal homepage: WWW.ELSEVIER.COM in uppercase."
编辑:
这个gettype()与OP的gettype()不同。
我的gettype()解析一个字符串,OP将搜索文件名为$ 1的文件
当你想使用我的gettype()时,你首先必须从pdf中提取正确的字符串(可能像https://stackoverflow.com/a/32466580/3220113)。