in gogo/jline/src/main/java/org/apache/felix/gogo/jline/Posix.java [1426:1513]
protected void echo(CommandSession session, Process process, Object[] argv) throws Exception {
final String[] usage = {
"echo - echoes or prints ARGUMENT to standard output",
"Usage: echo [OPTIONS] [ARGUMENTS]",
" -? --help show help",
" -n no trailing new line"
};
Options opt = parseOptions(session, usage, argv);
List<String> args = opt.args();
StringBuilder buf = new StringBuilder();
if (args != null) {
for (String arg : args) {
if (buf.length() > 0)
buf.append(' ');
for (int i = 0; i < arg.length(); i++) {
int c = arg.charAt(i);
int ch;
if (c == '\\') {
c = i < arg.length() - 1 ? arg.charAt(++i) : '\\';
switch (c) {
case 'a':
buf.append('\u0007');
break;
case 'n':
buf.append('\n');
break;
case 't':
buf.append('\t');
break;
case 'r':
buf.append('\r');
break;
case '\\':
buf.append('\\');
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
ch = 0;
for (int j = 0; j < 3; j++) {
c = i < arg.length() - 1 ? arg.charAt(++i) : -1;
if (c >= 0) {
ch = ch * 8 + (c - '0');
}
}
buf.append((char) ch);
break;
case 'u':
ch = 0;
for (int j = 0; j < 4; j++) {
c = i < arg.length() - 1 ? arg.charAt(++i) : -1;
if (c >= 0) {
if (c >= 'A' && c <= 'Z') {
ch = ch * 16 + (c - 'A' + 10);
} else if (c >= 'a' && c <= 'z') {
ch = ch * 16 + (c - 'a' + 10);
} else if (c >= '0' && c <= '9') {
ch = ch * 16 + (c - '0');
} else {
break;
}
}
}
buf.append((char) ch);
break;
default:
buf.append((char) c);
break;
}
} else {
buf.append((char) c);
}
}
}
}
if (opt.isSet("n")) {
process.out().print(buf);
} else {
process.out().println(buf);
}
}