【问题标题】:Remove ^M at end of each line in shell script [duplicate]删除 shell 脚本中每行末尾的 ^M [重复]
【发布时间】:2018-04-08 18:22:19
【问题描述】:

我有这个代码,但不起作用。

    line="20170425"
    anycopia=${line:0:4}
    mescopia=${line:4:2}
    diacopia=${line:6:2}
    echo $anycopia
    echo $mescopia
    echo $diacopia
    DATE=$(date +%Y%m%d)
    any=${DATE:0:4}
    mes=${DATE:4:2}
    dia=${DATE:6:2}
    echo $any
    echo $mes
    echo $dia
    if [ $anycopia == $any ]; then
        echo "equals"
    else
        echo "not equals"
    fi

错误:

    syntax error near unexpected token fi

我试过改“then”但没关系,就像这样:

    if [ $anycopia == $any ]
    then
        echo "equals"
    else
        echo "not equals"
    fi

同样的错误一直在发生。

PD:Stack Overflow 中具有相同问题的其他答案对我不起作用。

编辑: 我做了这个命令:

    hexdump -C script.sh

这是输出:

    00000000  6c 69 6e 65 3d 22 32 30  31 37 30 34 32 35 22 0d  |line="20170425".|
    00000010  0a 61 6e 79 63 6f 70 69  61 3d 24 7b 6c 69 6e 65  |.anycopia=${line|
    00000020  3a 30 3a 34 7d 0d 0a 6d  65 73 63 6f 70 69 61 3d  |:0:4}..mescopia=|
    00000030  24 7b 6c 69 6e 65 3a 34  3a 32 7d 0d 0a 64 69 61  |${line:4:2}..dia|
    00000040  63 6f 70 69 61 3d 24 7b  6c 69 6e 65 3a 36 3a 32  |copia=${line:6:2|
    00000050  7d 0d 0a 65 63 68 6f 20  24 61 6e 79 63 6f 70 69  |}..echo $anycopi|
    00000060  61 0d 0a 65 63 68 6f 20  24 6d 65 73 63 6f 70 69  |a..echo $mescopi|
    00000070  61 0d 0a 65 63 68 6f 20  24 64 69 61 63 6f 70 69  |a..echo $diacopi|
    00000080  61 0d 0a 44 41 54 45 3d  24 28 64 61 74 65 20 2b  |a..DATE=$(date +|
    00000090  25 59 25 6d 25 64 29 0d  0a 61 6e 79 3d 24 7b 44  |%Y%m%d)..any=${D|
    000000a0  41 54 45 3a 30 3a 34 7d  0d 0a 6d 65 73 3d 24 7b  |ATE:0:4}..mes=${|
    000000b0  44 41 54 45 3a 34 3a 32  7d 0d 0a 64 69 61 3d 24  |DATE:4:2}..dia=$|
    000000c0  7b 44 41 54 45 3a 36 3a  32 7d 0d 0a 65 63 68 6f  |{DATE:6:2}..echo|
    000000d0  20 24 61 6e 79 0d 0a 65  63 68 6f 20 24 6d 65 73  | $any..echo $mes|
    000000e0  0d 0a 65 63 68 6f 20 24  64 69 61 0d 0a 69 66 20  |..echo $dia..if |
    000000f0  5b 20 24 61 6e 79 63 6f  70 69 61 20 3d 3d 20 24  |[ $anycopia == $|
    00000100  61 6e 79 20 5d 3b 20 74  68 65 6e 0d 0a 20 20 20  |any ]; then..   |
    00000110  20 65 63 68 6f 20 22 68  6f 6c 61 22 0d 0a 65 6c  | echo "hola"..el|
    00000120  73 65 0d 0a 20 20 20 20  65 63 68 6f 20 22 61 64  |se..    echo "ad|
    00000130  65 75 22 0d 0a 66 69 0d  0a                       |eu"..fi..|
    00000139

PDD:我在 Windows 上的 Ubuntu 上使用 Bash 运行它。

编辑2:

    user@DESKTOP-UO9KRO4:/mnt/d$ cat -v script.sh
    line="20170425"^M
    anycopia=${line:0:4}^M
    mescopia=${line:4:2}^M
    diacopia=${line:6:2}^M
    echo $anycopia^M
    echo $mescopia^M
    echo $diacopia^M
    DATE=$(date +%Y%m%d)^M
    any=${DATE:0:4}^M
    mes=${DATE:4:2}^M
    dia=${DATE:6:2}^M
    echo $any^M
    echo $mes^M
    echo $dia^M
    if [ $anycopia == $any ]; then^M
        echo "hola"^M
    else^M
        echo "adeu"^M
    fi^M

【问题讨论】:

  • 这看起来应该可以。除非有一些不可见的字符导致问题。您可以在脚本文件 (hexdump -C yourscript.sh) 上运行 hexdump -C 并发布输出吗?
  • 嗨,它在我的电脑上运行正常。
  • cat -v yourscript?的输出是什么
  • hexdump 与上面的代码不匹配。

标签: bash shell


【解决方案1】:

^M 是回车符,通常在从 Windows 复制文件时看到。运行dos2unix 清理这些元字符。

dos2unix script.sh

也是一种安全的编码习惯,

  1. 始终用双引号括起您的变量,以免它们在包含空格或任何 shell 元字符时拆分
  2. 定义适当的 she-bang,即脚本运行时使用的解释器。 (大多数情况下,如果bash 可用#!/usr/bin/env bash#!/bin/bash

【讨论】:

  • 或者,如果您使用的是 Notepad++,请务必将 env 设置为屏幕右下角的 Unix(LF) 区域。
  • 成功了,谢谢!感谢所有帮助过我的人!
  • 如果您发现自己经常将脚本复制到 Ubuntu,我建议您使用 Atom 或 Geany 作为您的文本编辑器,或者两者兼而有之。很高兴它为您排序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-04
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2014-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多