冒号未正确打印

时间:2018-03-16 04:05:01

标签: bash shell unix

注意:我对bash不太了解。对不起,如果答案很明显。

我试图创建一个脚本,从文件中逐字符打印文本。在这样做的同时,我注意到冒号(:)被Illegal option -: ?替换出于某种原因。 我不知道为什么会发生这种情况或如何阻止它发生,这就是我在这里的原因。

代码(我从stackoverflow问题中得到了一些代码,并将其中的一些内容添加到其中):

#!/bin/sh
value=`cat $1`
iterate_over_chars()
{
    local seq="$1" OPTIND=1
    while getopts "$seq" opt "-$seq"; do
        echo -n "$opt"
        sleep 0.025
    done
}
iterate_over_chars "$value"
echo
echo
echo
echo END

要运行它我输入

sh name.sh test.txt 的test.txt:

test says: HI

输出

pi@raspberrypi:~ $ sh credits.sh test.txt
test saysIllegal option -:
? HI


END

同时改变echo -n" $ opt"回声-ne" $ opt"打印 - 在角色的前面而不是使用参数n和e。有这个原因吗?

1 个答案:

答案 0 :(得分:0)

我也避免getopts。 Bash有各种参数扩展,这是一种更本地的操作字符串的方式。在这种情况下,${s:0:1}可用于阻止字符串s的第一个字符,${s#?}用于发出除该字符串的第一个字符以外的所有字符。

这是使用这些表单的一种方式。我也是通过while循环中的read内置文件一次读取一行文件,而不是使用反引号捕获cat的输出。

#!/usr/bin/env bash

[ $# -eq 1 ] || { echo "Usage: ${0##*/} <file>" 1>&2; exit 1; }
[ -r "$1" ] || { echo "$1: cannot read" 1>&2; exit 1; }

iterate_over_chars() {
  local s="$1"
  while [ "$s" != '' ]; do
    echo -n "${s:0:1}"
    s=${s#?}
    sleep 0.025
  done
  echo
}

while IFS= read -r line; do
  iterate_over_chars "$line"
done < "$1"