Bash:elif不工作

时间:2015-09-23 18:30:38

标签: linux bash shell

我要写一个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
[...]

4 个答案:

答案 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)。