Jawaban membantu John1024 memberikan solusi umum yang menunjukkan cara membedakan opsi dari operan untuk semua Utilitas seperti POSIX.
Dalam kasus yang ada, solusi paling sederhana adalah (berfungsi tidak hanya di bash , tetapi juga di ksh dan zsh ):
printf '%.0s-' {1..100}
Menempatkan %.0s sebelum - menghindari masalah - awal disalahartikan sebagai opsi.
Sedikit dioptimalkan:
printf '%.s-' {1..100}
Saya akan merekomendasikan menggunakan for tradisional loop, karena tidak perlu menelurkan sub-proses atau memperluas 100 argumen:
N=100
for((i = 0; i < $N; ++i)); do
printf -
done
Sangat mengherankan bahwa printf -%s memicu "opsi tidak valid" tetapi printf - tidak. Agar lebih aman, Anda bisa melakukan printf %s - .
Gunakan for lingkaran dan rentang angka:
for i in {1..10};
do echo "-";
done
Atau dalam satu baris:
for i in {1..10};
do echo -n "-";
done
yang menghasilkan ---------- .
EDIT :Ini sebelum printf Anda sunting.
Ini menimbulkan kesalahan:
$ printf '-%.0s' {1..100}; echo ""
bash: printf: -%: invalid option
printf: usage: printf [-v var] format [arguments]
Ini bekerja dengan baik di bawah bash :
$ printf -- '-%.0s' {1..100}; echo ""
----------------------------------------------------------------------------------------------------
Untuk shell lain, coba:
printf -- '-%.0s' $(seq 100); echo ""
Masalahnya adalah printf mengharapkan - itu memulai sebuah opsi. Seperti yang umum di antara utilitas Unix/POSIX dalam situasi seperti ini, -- sinyal ke printf untuk tidak mengharapkan lebih banyak pilihan.