注意:我对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。有这个原因吗?
答案 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"